c#初始化

c#初始化,c#,initialization,C#,Initialization,是否需要初始化自动属性 public string thingy { get; set; } 我问这个问题的原因是因为我刚刚遇到了一堆代码,其中使用了null,默认值null是一个可接受的值 编译器没有抱怨 一般来说,如果编译器将默认数字设置为零,并且对象引用设置为空,那么为什么编译器会强制进行初始化?自动属性按默认值初始化(T)如果要按特殊值初始化,可以使用支持字段: private string _thingy = "value"; public string Thingy { g

是否需要初始化自动属性

public string thingy { get; set; }
我问这个问题的原因是因为我刚刚遇到了一堆代码,其中使用了null,默认值null是一个可接受的值

编译器没有抱怨


一般来说,如果编译器将默认数字设置为零,并且对象引用设置为空,那么为什么编译器会强制进行初始化?

自动属性按默认值初始化(T)如果要按特殊值初始化,可以使用支持字段:

private string _thingy = "value";
public string Thingy
{
    get { return _thingy; }
    set { _thingy = value; }
}
或在构造函数中设置值

public class MyClass
{
    public string Thingy{get;set;}
    public MyClass()
    {
        Thingy = "value";
    }
}

或在任何方法中设置

编译器对局部变量强制初始化,而不是对字段或属性强制初始化。C#要求明确分配局部变量,因为使用未分配的局部变量是程序错误的常见来源。这不是因为未分配变量可能包含垃圾(CLR保证不会),而是因为程序员可能在代码中犯了错误


编译器不会以相同的方式处理字段或属性,因为不可能跨多个可以以任何顺序调用的方法进行必要的流分析。

它将始终是
default(t)
编译器对局部变量强制初始化-它们永远不会得到默认值。另一方面,成员变量将获得默认值。同样值得一读的是Eric Lippert在这里给出的答案:@nearoceprogrammer感谢发布该链接。我对C#编译器的了解几乎都来自Eric的博客或他在stackoverflow上的回答。