<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 原則13:使用恰當的方式對靜態成員進行初始化 **By D.S.Qiu** **尊重他人的勞動,支持原創,轉載請注明出處:[http://dsqiu.iteye.com](http://dsqiu.iteye.com)** 你應該知道靜態成員變量在創建對象實例之前就已經初始化了。C# 提供了靜態初始化語法和靜態構造函數對靜態成員變量進行初始化。靜態構造函數是一個比其他函數,變量,屬性在沒有訪問之前就被執行的特殊函數。你可以使用這個函數初始化靜態變量,完善單例模式,或者任何需要在類還沒有被使用的必要工作。你不能使用構造函數,一些特殊 private 函數,或其他語法初始化靜態變量。 和實例初始化一樣,初始化語法是靜態構造函數的另一選擇。你只需要聲明一個靜態成員,然后使用初始化語法。如果有靜態變量的初始化邏輯很復雜,你可以創建一個靜態構造函數。 C# 實現單例模式最常用的方法就是靜態構造函數。讓構造函數變為 private ,然后添加一個初始化語法: ``` public class MySingleton { private static readonly MySingleton theOneAndOnly = new MySingleton(); public static MySingleton TheOnly { get { return theOneAndOnly; } } private MySingleton() { } // remainder elided } ``` 單例模式很容易像上面的方式一樣實現。如果初始化邏輯更復雜: ``` public class MySingleton2 { private static readonly MySingleton2 theOneAndOnly; static MySingleton2() { theOneAndOnly = new MySingleton2(); } public static MySingleton2 TheOnly { get { return theOneAndOnly; } } private MySingleton2() { } // remainder elided } ``` 和實例初始化一樣,靜態初始化語法在任何靜態構造函數之前執行。并且,你的靜態初始化語法比基類的靜態構造函數更早執行。 CLR 在類型第一次在應用空間被訪問之前自動執行靜態構造函數。你只能定義一個靜態構造函數,并且不能有參數。因此你需要注意在靜態構造函數是否會產生異常。如果你在靜態構造函數拋出了異常, CLR 會終止你的程序。這種情況捕獲異常是非常陰險的。這時的代碼區創建這個類型就會失敗直到 AppDomain 被卸載。 CLR 就不能執行靜態構造函數去初始化這個類型。即使你再嘗試,類型不會被正確初始化。創建這個類型的對象(或者任意子類)都是沒有被定義的。所以,這是不允許的。 異常是使用靜態構造函數代替靜態初始化語法的最常見原因。因為你使用靜態初始化語法,你不能自己捕獲異常。使用靜態構造函數,你就可以(查看原則47:): ``` static MySingleton2() { try { theOneAndOnly = new MySingleton2(); } catch { // Attempt recovery here. } } ``` 靜態初始化語法和靜態構造函數是最干凈,最清晰的方式去初始化靜態成員變量。它們具有很強的可讀性和很容易正確使用。它們被支持就是為了解決這個其他語言初始化靜態成員會出現的問題。 小結: 這個事情一直拖著,一直想繼續,今天又起了個頭了,希望能一鼓作氣。翻譯很爛并且有很多不明確的地方(自己讀的疑惑),算是給自己買下一個伏筆吧,還有很多工作要去完善。 歡迎各種不爽,各種噴,寫這個純屬個人愛好,秉持”分享“之德! 有關本書的其他章節翻譯請[點擊查看](/category/297763),轉載請注明出處,尊重原創! 如果您對D.S.Qiu有任何建議或意見可以在文章后面評論,或者發郵件(gd.s.qiu@gmail.com)交流,您的鼓勵和支持是我前進的動力,希望能有更多更好的分享。 轉載請在**文首**注明出處:[http://dsqiu.iteye.com/blog/2077189](/blog/2077189) 更多精彩請關注D.S.Qiu的博客和微博(ID:靜水逐風)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看