这是某些 C# 版本的奇怪之处;编译器有时无法正确检测到该结构已通过构造函数在所有代码路径上完全初始化。
解决方法是说
public Point(int x, int y) : this() // default initialization
{
this.X = x;
this.Y = y;
}
它告诉编译器“这些字段在构造函数中初始化之前已初始化为其默认值”。
这是我们做 C# 3 时语言设计的一点失败;根本不清楚这是否是您必须做的。对于那个很抱歉。
既然我引起了您的注意,让我们解决您提出的另一点:
我假设您无法更改结构上的值
You can改变结构上的值,但是你不应该。结构应该是:
所以我的建议是将设置器设置为私有 (with private set;
)
你已经创建了一个可变的点结构,这是一个不好的做法。创建一个不可变的点结构,并将它们视为不可变的数学对象,而不是变量的集合。
Also:
关键字 this 指的是结构的属性
关键词this
is an 保存结构实例值的变量的别名。这是微妙的;让我举一个例子。如果我们说:
Point a = new Point(1, 2);
这意味着:
- 创建一个新的临时存储变量,其大小为一个点。
- 调用双参数构造函数,使得
this
该临时存储变量的别名,并将 1 和 2 复制到形参 x 和 y 中。
- 构造函数返回后,将临时变量中的值复制到变量中
a
.
现在,您可能会注意到,这样做似乎会更有效:
- 调用双参数构造函数,使得
this
的别名a
, 等等。
而且效率会更高;这就是所谓的复制省略优化C# 做到了当它知道用户不可能注意到差异时。 (挑战:构建一个 C# 程序,用户可以在其中确定是否使用复制省略;C# 将not在这样的程序中复制删除!)
同样,如果您随后这样做:
struct Point
{
... constructors, whatever ...
public double DistanceFromOrigin()
{
return Math.Sqrt(this.X * this.X + this.Y * this.Y);
}
你打电话时a.DistanceFromOrigin()
, this
成为别名a
;他们是相同的变量只是有两个不同的名字。
This is not引用类型如何工作。在引用类型中,this
is a copy of the 参考。在值类型中,this
is an 变量的别名.
这些都是微妙的点。