如果未初始化struct并且我们尝试访问属性但不使用变量,则编译器会出错

Pun*_*nit 9 .net c# struct

我有一个关于结构的观察.当我在Struct中声明一个属性,如果我没有初始化Struct那么它给我下面的错误 - "使用未分配的局部变量empStruct"

PSeduo代码 -

struct EmpStruct
{
    private int firstNumber;
    public int FirstNumber
    {
        get { return firstNumber; }
        set { firstNumber = value; }
    }

    public int SecondNumber; 

}
Run Code Online (Sandbox Code Playgroud)

Program.cs-

EmpStruct empStruct;
empStruct.FirstNumber = 5;
Run Code Online (Sandbox Code Playgroud)

但是当我声明公共变量时,上面的代码就可以了.

EmpStruct empStruct;
empStruct.SecondNumber;
Run Code Online (Sandbox Code Playgroud)

所以我的问题是为什么编译器在我尝试访问变量时不会出错.(如果是Class,它会给出错误).

jas*_*son 12

这个帖子里有很多混乱.

原理是:struct在明确分配a实例的所有字段之前,不能在实例上调用任何属性或方法.

这就是你的第一个代码块无法编译的原因.您正在访问一个属性,而没有明确分配所有字段.

第二个代码块编译,因为可以访问一个字段而没有明确分配所有字段.

确定分配a的一种方法struct是说

EmpStruct empStruct = new EmpStruct();
Run Code Online (Sandbox Code Playgroud)

这将调用默认的无参数构造函数,EmpStruct该构造函数肯定会分配所有字段.

规范的相关部分是关于定义分配的§5.3.并且来自§11.3.8中的示例

在构造的结构的所有字段都已明确赋值之前,不能调用实例成员函数(包括属性的集合访问器XY).

如果编译器错误消息是沿着这条线的话,那会更有帮助(嗯,Eric Lippert!)

使用未明确分配的局部变量empStruct.

然后就可以清楚地了解在规范中或Google搜索的内容.

现在,请注意您已定义了一个可变结构.这是危险的,也是邪恶的.你不应该这样做.取而代之的是,将一个公共的构造函数,可以让你绝对分配firstNumbersecondNumber,并从公共二传手EmpStruct.FirstNumber.