我在 C# 中有两个相似的结构,每个都包含一个整数,但后者实现了 get/set 访问器。
为什么我必须在分配 a
字段之前使用 new
运算符初始化 Y
结构?当我用 new
初始化 y
时它仍然是一个值类型吗?
public struct X
{
public int a;
}
public struct Y
{
public int a { get; set; }
}
class Program
{
static void Main(string[] args)
{
X x;
x.a = 1;
Y y;
y.a = 2; // << compile error "unused local variable" here
Y y2 = new Y();
y2.a = 3;
}
}
最佳答案
一个有效而另一个无效的原因是您不能在未初始化的对象上调用方法。属性 setter 也是方法。
public struct X
{
public int a;
public void setA(int value)
{ this.a = value; }
}
public struct Y
{
public int a { get; set; }
}
class Program
{
static void Main(string[] args)
{
X x;
x.setA(1); // A: error
x.a = 2; // B: okay
Y y;
y.a = 3; // C: equivalent to A
}
}
不允许的原因是属性 setter 可以观察到对象的未初始化状态。调用者不知道属性 setter 是仅仅设置一个字段,还是做更多的事情。
关于c# - 结构初始化和新操作符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20226477/