gpt4 book ai didi

c# - 更改值类型的 'this' 变量

转载 作者:IT王子 更新时间:2023-10-29 03:43:50 25 4
gpt4 key购买 nike

显然,您可以从结构中的任何地方(但不能在类中)更改 this 值:

struct Point
{
public Point(int x, int y)
{
this = new Point();
X = x; Y = y;
}
int X; int Y;
}

我以前既没见过也不需要它。为什么会有人想要那样做? Eric Lippert reminds us一个特性必须被证明是可以实现的。什么伟大的用例可以证明这一点?在任何情况下这是无价的吗? 我找不到关于它的任何文档1

此外,对于调用构造函数,已经有一种更广为人知的替代语法,因此此功能有时是多余的:

public Point(int x, int y)
: this()
{
X = x; Y = y;
}

我在 Jeffrey Richter 的 CLR via C# 4th edition 中的一个例子中发现了这个特性。 .
1) 显然它在 C# specification 中.

最佳答案

好问题!

根据定义,值类型是按值复制的。如果 this 实际上不是存储位置的别名,那么构造函数将初始化一个副本,而不是初始化您打算初始化的变量。这将使构造函数变得不那么有用!方法也类似;是的,可变结构是邪恶的,但如果你要再次创建一个可变结构,this 必须是正在发生变化的变量,而不是其值的副本。

您所描述的行为是该设计决策的逻辑结果:由于 this 为变量设置了别名,因此您可以将其赋值给它,就像您可以将其赋值给任何其他变量一样。

像那样直接赋值给 this 而不是赋值给它的字段有点奇怪。直接赋值给 this 然后 100% 覆盖该赋值就更奇怪了!

避免使 this 成为接收方存储的别名的替代设计是将 this 从短期存储池中分配出来,在 ctor 中对其进行初始化,然后按值返回。该方法的缺点是它几乎不可能进行复制省略优化,并且使构造函数和方法异常不一致。

关于c# - 更改值类型的 'this' 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14764927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com