我有一个结构定义,它包含一个公共字段和一个名为_one和One的公共属性,现在我在main函数中实例化struct(不创建新对象),并从struct中调用Property,我是得到编译时错误说使用未分配的局部变量一,但是当我调用字段_one时,它在我的工作中非常期望:
public struct myStruct
{
public int _one;
public int One
{
get { return _one; }
set { _one = value; }
}
public void Display()
{
Console.WriteLine(One);
}
}
static void Main(string[] args)
{
myStruct _struct;
_struct.One = 2; // Does not works
_struct._one = 2; // Works fine
}
任何人都可以解释这背后的原因,无法理解这个概念。
答案 0 :(得分:1)
您需要初始化结构以便可以访问该属性 - _struct
具有默认值,否则:
myStruct _struct = new myStruct();
顺便说一下 - mutable value types are evil。
答案 1 :(得分:1)
这是不直观的行为,但 Definite assignment checking 的规则允许这样做。在C#语言规范的第5.3节中详细描述。本章前面的关键词是:
除上述规则外,以下规则适用于struct-type变量及其实例变量:
- 如果实例变量的包含struct-type变量被认为是明确赋值的,则认为它是明确赋值的 - 如果结构类型变量的每个实例变量都被认为是明确赋值的,则它被认为是明确赋值的。
后一条规则允许这样做。换句话说,您还可以通过分配其所有变量来初始化结构。您可以通过尝试这些片段来看到这一点:
myStruct _struct = new myStruct();
_struct.Display(); // fine by the 1st bullet
myStruct _struct;
_struct.Display(); // bad
myStruct _struct;
_struct._one = 2;
_struct.Display(); // fine by the 2nd bullet
因此,您不会通过分配字段来获取CS0165,因为这将通过分配其变量来禁止初始化结构。
答案 2 :(得分:0)
有利于在类定义中使用读写属性而不是暴露字段的原因不适用于结构,因为它们既不支持继承也不支持更新通知,并且struct字段的可变性取决于struct的可变性实例,,无论该字段是否暴露。如果结构应该表示一组相关但可自由独立修改的变量,那么它应该简单地将这些变量公开为字段。如果具有支持字段的属性应该是只读的,则构造函数应该直接设置支持字段,而不是通过属性设置器。