【发布时间】:2013-11-26 19:43:33
【问题描述】:
我在 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;
}
}
【问题讨论】:
-
我有点惊讶
X x; x.a = 1;工作...... -
Mutable
structs are evil。我对 C# 非常熟悉,但我完全希望您使用X的示例无法编译。确实如此,很奇怪。但是,X x; Console.WriteLine(x);不,X x; x.a = 1; Console.WriteLine(x);有效。 -
另外,你不应该有非私有字段,你应该将它们设为属性(如
Y)。 -
我认为我们需要 Jon Skeet 或 Eric Lippert 来解释这个魔法。看起来将所有字段都分配为初始化。但在第二种情况下,它是调用未初始化结构的方法。
-
规范来了! “12.3 明确分配”(ecma-334 的第 122 页)。 “如果一个结构类型变量的每个实例变量都被认为是明确分配的,那么它就被认为是明确分配的”