在完全初始化结构之前访问结构的字段
本文关键字:结构 访问 字段 初始化 | 更新日期: 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:
从MSDN:当你使用new操作符创建一个struct对象时,它得到创建并调用相应的构造函数。与类不同的是,可以在不使用new操作符的情况下实例化结构。在这样一个在这种情况下,没有构造函数调用,这使得分配更多非常高效。但是,这些字段将保持未分配状态,对象也将保持在初始化所有字段之前不能使用。
从MSDN:编译错误CS0170:使用可能未分配的字段'field'。一个字段在没有初始化的情况下被使用。来要解决这个问题,首先确定哪个字段未初始化和然后在尝试访问它之前初始化它。
编译错误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;