出于好奇:
此代码有效并执行:
public class Program
{
private static DateTime date;
public static void Main()
{
Console.WriteLine(date.ToString("o"));
}
}
请参阅.NET Fiddle
但这甚至没有编译(未分配的局部变量):
public class Program
{
public static void Main()
{
DateTime date;
Console.WriteLine(date.ToString("o"));
}
}
上查看( not )
DateTime是一个不可为空的值类型,因此不需要将其分配和初始化为具有值,它具有默认值。
那么为什么编译器允许DateTime字段版本编译而不让本地变量版本编译?当代码编译为IL时,是什么阻止使用值类型局部变量?
答案 0 :(得分:2)
没有显式初始化的字段会自动初始化为默认值。
这很有用,因为它是一个非常常见的初始值,因此可以节省时间。
没有初始化的本地处于无法使用的状态。
这很有用,因为你很可能做错了(特别是如果有多条路径可以确定初始值),所以只需将其设置为默认值就可能隐藏错误。
答案 1 :(得分:1)
本地变量不会自动初始化,因此没有默认值。出于明确赋值检查的目的,局部变量最初被认为是未分配的。局部变量声明可以包括局部变量初始化器,在这种情况下,变量在整个范围内被认为是明确赋值的,除了在local-variable-initializer中提供的表达式之外。
在局部变量的范围内,在本地变量声明符之前的文本位置引用该局部变量是编译时错误。
来源: - https://msdn.microsoft.com/en-us/library/aa691170(v=vs.71).aspx
答案 2 :(得分:0)
DateTime是一个不可为空的值类型,因此不需要将其分配和初始化为具有值,它具有默认值
不完全是。
来自docs:
与类不同,可以在不使用
new
运算符的情况下实例化结构。在这种情况下,没有构造函数调用,这使得分配更有效。 但是,字段将保持未分配状态,并且在初始化所有字段之前无法使用该对象。
请参阅“为什么编译器允许DateTime字段版本编译而不让本地变量版本编译?”
的其他答案