Object 在c中从结构调用属性#

Object 在c中从结构调用属性#,object,properties,struct,c#-2.0,field,Object,Properties,Struct,C# 2.0,Field,我定义了一个结构,其中包含一个公共字段和一个公共属性,分别名为_one和one,现在我在主函数中实例化了该结构(不创建新对象),并从该结构调用了该属性,我得到了编译时错误,即使用未分配的局部变量one,然而,当我调用field _one时,它非常有效,我正在做的是: public struct myStruct { public int _one; public int One { get { return _on

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

任何人都可以解释这背后的原因,无法理解这个概念。

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

myStruct _struct = new myStruct(); 

顺便说一下-。

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

这是不直观的行为,但明确赋值检查规则允许这样做。在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,因为这将不允许通过分配变量来初始化结构。

是的,我在初始化结构属性时对此进行了检查,您能告诉我实际产生了什么差异吗,如果没有初始化,它不允许属性,那么为什么Fields@Abbas-由于值类型不能为null,因此当您引用一个值类型时,它将被初始化为某个值。这些字段将被初始化为默认值。对于
int
,这将是
0