我定义了一个结构,它包含一个公共字段和一个公共属性,分别名为_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
}
有人能解释这背后的原因吗,不能理解这个概念。
您需要初始化结构,以便可以访问属性-
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,因为这将不允许通过分配变量来初始化结构。
支持在类定义中使用读写属性而不是公开字段的理由不适用于结构,因为它们既不支持继承也不支持更新通知,而且结构字段的可变性取决于结构实例的可变性,而不管字段是否公开。如果一个结构表示一组相关但可自由独立修改的变量,那么它应该简单地将这些变量公开为字段。如果假定具有备份字段的属性是只读的,则构造函数应直接设置备份字段,而不是通过属性设置器设置。