2

我定义了一个结构,其中包含一个公共字段和一个分别名为 _one 和 One 的公共属性,现在我在主函数中实例化结构(不创建新对象),并从结构中调用属性,我正在编译时间错误说使用未分配的局部变量 One,但是当我调用字段 _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
        }

谁能解释这背后的原因,无法理解这个概念。

4

3 回答 3

2

您需要初始化结构才能访问该属性 -_struct否则具有默认值:

myStruct _struct = new myStruct(); 

顺便说一句,可变值类型是邪恶的

于 2012-11-27T16:48:30.690 回答
1

这是不直观的行为,但它是明确分配检查规则所允许的。在 C# 语言规范的第 5.3 节中进行了极其详细的描述。本章开头的关键短语是:

除上述规则外,以下规则适用于结构类型变量及其实例变量:
- 如果实例变量包含的结构类型变量被认为是明确分配的,则认为该实例变量是明确分配的。
- 如果一个结构类型变量的每个实例变量都被认为是确定分配的,那么它就被认为是确定分配的。

正是后一条规则允许这样做。换句话说,您还可以通过分配其所有变量来初始化结构。您可以通过尝试这些片段来看到这一点:

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,因为这将不允许通过分配其变量来初始化结构。

于 2012-11-27T17:46:29.713 回答
0

倾向于在类定义中使用读写属性而不是公开字段的原因不适用于结构,因为它们既不支持继承也不支持更新通知,并且结构字段的可变性取决于结构实例的可变性,无论字段是否暴露。如果一个结构应该表示一组相关但可以自由独立修改的变量,它应该简单地将这些变量公开为字段。如果带有支持字段的属性应该是只读的,则构造函数应该直接设置支持字段,而不是通过属性设置器。

于 2012-11-27T17:01:54.917 回答