C#编译器-未赋值字段和局部变量初始值
出于好奇: 此代码有效并执行:C#编译器-未赋值字段和局部变量初始值,c#,.net,datetime,compiler-errors,compilation,C#,.net,Datetime,Compiler Errors,Compilation,出于好奇: 此代码有效并执行: public class Program { private static DateTime date; public static void Main() { Console.WriteLine(date.ToString("o")); } } 看到它在工作吗 但它甚至不编译(未分配的局部变量): 看到它(不)工作了吗 DateTime是一种不可为空的值类型,因此不需要为其赋值和初始化,它有一个默认值 那么为什
public class Program
{
private static DateTime date;
public static void Main()
{
Console.WriteLine(date.ToString("o"));
}
}
看到它在工作吗
但它甚至不编译(未分配的局部变量):
看到它(不)工作了吗
DateTime是一种不可为空的值类型,因此不需要为其赋值和初始化,它有一个默认值
那么为什么编译器允许DateTime字段版本编译而不允许本地变量版本编译呢?当代码编译为IL时,是什么阻止使用值类型的局部变量?没有显式初始化的字段将自动初始化为默认值 这很有用,因为它是一个非常常见的初始值,因此可以节省时间 没有初始化的本地文件处于无法使用的状态
这很有用,因为您很可能做错了什么(特别是在有多条路径确定初始值的情况下),因此仅将其设置为默认值可能会隐藏错误。局部变量不会自动初始化,因此没有默认值。为了确定赋值检查,局部变量被认为是初始未赋值的。局部变量声明可能包括局部变量初始值设定项,在这种情况下,除了在局部变量初始值设定项中提供的表达式内,变量被视为在其整个范围内明确赋值 在局部变量的范围内,在局部变量声明符之前的文本位置引用该局部变量是编译时错误 资料来源: DateTime是一种不可为空的值类型,因此不需要为其赋值和初始化,它有一个默认值 不完全是 从: 与类不同,结构可以在不使用
new
运算符的情况下实例化。在这种情况下,没有构造函数调用,这使得分配更加有效但是,字段将保持未分配状态,并且在初始化所有字段之前无法使用对象
请参阅“为什么编译器允许DateTime字段版本编译而不允许本地变量版本编译?”的其他答案。可能取决于变量所在的位置、堆栈与可能的副本
public class Program
{
public static void Main()
{
DateTime date;
Console.WriteLine(date.ToString("o"));
}
}