在完全初始化结构之前访问结构的字段

本文关键字:结构 访问 字段 初始化 | 更新日期: 2023-09-27 18:13:12

考虑以下代码:

public struct Color {
    public int R;
    public int G;
    public int B;
}
public class App
{
    static void Main()
    {
        Color c;
        c.B = 0xFF;
        int b = c.B;
    }
 }

csc愉快地编译代码。我一直认为在访问结构体的数据成员之前,必须对结构体的所有字段进行赋值。这是csc.exe的特色吗?

我认为NullReferenceExceptions不是正确的解决方案,因为我们在这里讨论的是结构体。

在完全初始化结构之前访问结构的字段

From MSDN:

当你使用new操作符创建一个struct对象时,它得到创建并调用相应的构造函数。与类不同的是,可以在不使用new操作符的情况下实例化结构。在这样一个在这种情况下,没有构造函数调用,这使得分配更多非常高效。但是,这些字段将保持未分配状态,对象也将保持在初始化所有字段之前不能使用。

从MSDN:

编译错误CS0170:使用可能未分配的字段'field'。一个字段在没有初始化的情况下被使用。来要解决这个问题,首先确定哪个字段未初始化和然后在尝试访问它之前初始化它。

从MSDN:

编译错误CS0165:使用未分配的局部变量'name'。c#编译器不允许使用未初始化的变量。如果编译器检测到可能没有使用的变量初始化后,生成编译错误CS0165.


这是错误的:

我一直认为,在访问结构体

的数据成员之前,必须对结构体的所有字段进行赋值。

正确的是:

在访问结构体之前,必须对结构体的所有字段进行赋值。


Color c;
c.B = 0xFF;
int b = c.B; // Okay. You have assigned B
int r = c.R; // Error CS0170! Use of possibly unassigned field
Color cc = c; // Error CS0165! Use of unassigned local variable. The object cannot be used until all of the fields are initialized

参考此链接

msdn墨水

如果您使用Color c;,则字段不初始化,但如果您使用Color c = new Color();,则所有字段都将初始化。

,如果运行下面的代码。编译失败。

    Color c;
    int b = c.B;

但是这将被编译。

       Color c = new Color();
       // c.B = 0xFF;
        int b = c.B;