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

时间:2016-10-16 11:00:11

标签: c# .net struct new-operator

请考虑以下代码:

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不是正确的解决方案,因为我们在这里讨论结构。

2 个答案:

答案 0 :(得分:3)

来自MSDN

  

使用new运算符创建struct对象时,它会获得   创建并调用适当的构造函数。与课程不同,   可以在不使用new运算符的情况下实例化结构。在这样的   case,没有构造函数调用,这使得分配更多   高效。但是,字段将保持未分配和对象   在初始化所有字段之前不能使用。

来自MSDN

  

编译器错误CS0170 :使用可能未分配的字段“字段”。一个   在没有首先初始化的情况下使用结构中的字段。至   解决这个问题,首先确定哪个字段未初始化   然后在尝试访问它之前初始化它。

来自MSDN

  

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

这是错误的:

  

我一直认为必须先分配结构的所有字段才能访问结构的数据成员

正确的是:

  

在可以访问结构之前,必须先分配结构的所有字段。

for k in range(number gf bike stations):

答案 1 :(得分:0)

参考此链接

msdn ink

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

如果您运行以下代码。它将无法编译。

    Color c;
    int b = c.B;

但这将被编译。

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