你的问题不是很清楚。但是,始终将类或结构的 field(实例或静态)视为已分配是正确的。它将具有类型的默认值,对于引用类型和可空类型,它是 null,对于其他值类型,它是“零”或类似于零的东西。
相比之下,局部变量,即在方法(或构造函数,或访问器等)中声明的变量,必须在使用前显式赋值。
在示例中:
class Example
{
int field;
void Method()
{
int local;
...
...
}
}
field 被认为是自动赋值的,并将具有初始值 0,而变量 local 未赋值,必须先赋值(稍后以相同的方法)才能使用(甚至稍后在同样的方法)。
不过,未分配的局部变量可以作为方法的 out 参数传递。
编辑:(在有用的 cmets 之后)
我上面的回答对类的(静态和非静态)字段和结构的静态字段给出了非常精确的描述。但是,正如 cmets 指出的那样,在结构的实例字段的情况下,缺少一些东西。
当结构实例的所有实例字段都被完全分配时,它被完全分配。给定以下(可变的!!)结构:
struct SomeStruct
{
public int AlphaField;
public int BetaField;
}
那么以下是合法的:
void M()
{
SomeStruct localSS;
// localSS and its fields are not assigned, and can't be read yet
localSS.AlphaField = 7; // legal
int useA = localSS.AlphaField; // legal, AlphaField is assigned
// localSS and its remaining field BetaField are not assigned
localSS.BetaField = 13;
string useB = localSS.ToString(); // legal, localSS variable is now fully assigned
}
即使上面的例子看起来很疯狂(因为大多数人不鼓励可变结构),它仍然完全等同于在结构的用户定义实例构造函数中发生的事情。 C# 规范使用这句话:结构的实例构造函数的this 变量的行为与结构类型的out 参数完全相同——特别是,这意味着必须明确地分配变量实例构造函数的每一个执行路径。
请注意,结构的实例构造函数分配所有字段的一种方法是使用 : this(...) 构造函数链接语法链接另一个实例构造函数。
还要注意结构的实例构造函数必须带参数。表达式new SomeStruct()(参数列表为空)等价于default(SomeStruct),并计算为SomeStruct 的明确分配实例,其中所有字段都有其默认值。