提问者:小点点

在C#中从结构调用属性


我定义了一个结构,它包含一个公共字段和一个公共属性,分别名为_One和One,现在我在main函数中实例化结构(不创建新对象,并从结构调用属性,我得到了编译时错误,说使用了未赋值的局部变量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
        }

有人能解释这背后的原因吗,不能理解这个概念。


共3个答案

匿名用户

您需要初始化结构,以便可以访问属性-具有默认值,否则:

myStruct _struct = new myStruct(); 

顺便说一下--可变值类型是邪恶的。

匿名用户

null

除上述规则外,以下规则还适用于结构类型变量及其实例变量:
-如果认为包含该结构类型变量的实例变量已被明确赋值,则认为该实例变量已被明确赋值。br>-如果认为该结构类型变量的每个实例变量已被明确赋值,则认为该结构类型变量已被明确赋值。

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

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

匿名用户

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