爲字段設置初始值

在開發中爲字段設置初始值這是最基本的要求,但是很多開發人員會在構造函數變多的時候忘記給成員變量設置初始值。爲了避免這個問題,我們最好在聲明的時候直接初始化,而不是在實現構造函數的時候去初始化。編譯器會幫助開發人員在每個構造函數開頭放入一段代碼,這段代碼會把開發人員在定義成員字段時所指定的初始值設置給這些成員字段。如果沒有顯示定義構造函數,那麼編譯器就會先創建默認構造函數,之後再向其中加入初始化代碼。

雖然通過初始化語句可以避免忘記給成員變量設置初始值,但是這並不是在任何情況下都可以使用的。在 C# 中有三種情況是不可以使用初始化語句的。

  1. 把對象初始化爲 0 或者 null
    系統在運行開發人員編寫的代碼前會執行本身的初始化邏輯,系統本身的初始化邏輯會把相關的內容設置爲 0 ,這個初始化邏輯是由處理器指令來進行的,這些指令會將要使用到的內存塊全部設置爲 0 。如果我們將對象初始化爲 0 或者 null 時,編譯器就會在執行完系統本身的初始化邏輯後,將經由系統初始化過的內容清零。例如下面這段代碼:
public struct Demo
{
    // more code
}
Demo demo1;
Demo demo2 = new Demo();

在上面的代碼中 demo1 是經過系統進行初始化的,系統將 demo1 所在的內存塊設置爲了 0,而 demo2 是通過 IL 指令來進行清零的,這樣就會出發裝箱和拆箱操作,進而初始化會花費多一點的時間。
2. 不同構造函數按照自己的方式初始化字段
初始化語句只適合初始化邏輯不變的情況下,如果需要在不同的構造函數中使用不同的初始化邏輯,那麼這種方式就不管用了。我們來看一個例子。

public class Demo
{
    List<int> list = new List<int>();
    public Demo()
    {
    }
    public Demo(int length)
    {
        list = new List<int>(length);
    }
}

上述代碼中我們在聲明變量的時候進行了初始化,但是第二個構造函數通過傳入一個整數來指定集合的長度,這時我們的程序就創建了兩個 list ,只不過第一個 list 在創建出來之後會被後創建的 list 取代掉(字段初始化語句優先於構造函數執行)。
3. 初始化變量過程中有可能引入異常
在部分情況下初始化變量的過程有可能會出現異常,這時我們就不能使用初始化語句來設置初始值,應該將初始化邏輯放在構造函數裏,並在構造函數裏捕捉異常並處理,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章