<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 原則12:選擇變量初始化語法(initializer)而不是賦值語句 **By D.S.Qiu** 尊重他人的勞動,**支持原創,轉載請注明****[出處](/blog/1987663)****:[http://dsqiu.iteye.com](http://dsqiu.iteye.com)** 類經常會有多個構造函數。時間一長,成員變量和構造器很難保持同步。避免這個的最好方式就是在變量聲明的時候初始化而不是在構造函數內初始化。你應該使用初始化語法為靜態變量和實例變量進行初始化。 在 C# 中,當你聲明變量的時候構建變量是很自然的。當你聲明變量時直接進行初始化: ``` public class MyClass { // declare the collection, and initialize it. private List<string> labels = new List<string>(); } ``` 無論 MyClass 類有多少個構造函數, labels 都會被正確初始化。編譯器會在構造器的開頭為你定義的實例成員變量生成初始化代碼。當你增加一個構造函數, labels 就會獲得初始化。同樣的,如果你增加一個新的成員變量,你不需要在每個構造函數中添加初始化代碼,在定義的地方初始化變量是非常合適的。同樣重要的是,初始化語句(initializer①)也會被添加進編譯器產生的默認構造函數中。當你的類沒有顯式定義任何構造函數編譯器會創建一個默認構造函數。 初始化語句比構造函數中的語句更方便快捷。初始化語句被放在你的構造函數之前。初始化語句在基類構造函數之前執行,而且它們執行的順序是定義它們的順序。 使用初始化語句是你的類中成員變量未初始化最簡單的方法,但不完美。有三種情況,你不應該使用初始化語句語法。第一種情況是當你要將對象初始化為0或 null ,系統在你的代碼執行之前,會默認為所有內容設置為0。系統產生的0初始化是使用非常低級的 CPU 指令設置整塊內存為0。你的任何額外的0初始化都是多余的。 C# 編譯器會非常盡責地添加額外指令去又一次設置內存為0。這沒有問題——只是低效的。實際上,如果是值類型,那會更低效。 ``` MyValType myVal1; // initialized to 0 MyValType myVal2 = new MyValType(); // also 0 ``` 上面兩條語句的變量都會初始化為0。第一個是設置 myVal1 的內存為0。第二個是使用 IL 指令 initObj ,這個會引起 myVal2 的封箱和拆箱操作。這需要相當的額外時間(查看原則45)。 當你對同一個對象進行多次初始化時,第二種情況就來了。只有變量在所有構造函數中接收的初始化代碼是一樣的才使用初始化語句語法。下面版本的 MyClass 構造函數呢中創建兩個不同的 List 對象: ``` public class MyClass2 { // declare the collection, and initialize it. private List<string> labels = new List<string>(); MyClass2() { } MyClass2(int size) { labels = new List<string>(size); } } ``` 當你創建 MyClass2 對象,并指定了集合的大小,你就創建了兩個數組隊列。其中一個立即變為垃圾。變量初始化語句在每個構造函數之前執行。構造函數中創建了第二個數組隊列。編譯器產生了這樣的 MyClass2 版本,當然你是絕不會手動這樣寫的。(查看原則14,使用恰當方式處理這個問題)。 ``` public class MyClass2 { // declare the collection, and initialize it. private List<string> labels; MyClass2() { labels = new List<string>(); } MyClass2(int size) { labels = new List<string>(); labels = new List<string>(size); } } ``` 如果你使用隱式屬性也是會出現同樣的情況(查看原則1)。你的代碼不能訪問編譯生成的備份存儲域,所以隱式屬性就不能使用初始化語句。除了在構造函數匯總初始化隱式屬性,你別無選擇。使用隱式屬性仍然具有的一個好處就是在 set 訪問器中不用進行邏輯校驗。如果你把隱式屬性遷移為命名的備份存儲域,你應該使用初始化語法而不是構造函數來更新初始化代碼。因為使用隱式屬性是數據成員的更好選擇,原則14說明了如何減少隱式屬性數據域的復制。 要在構造函數中初始化的最后一個原因是方便異常的處理。你不能再初始化語句中使用 try 塊。初始化成員變量時的任何異常都會傳給實例化的對象。你不能在類內對這個異常進行捕獲。你需要把初始化代碼移到構造函數中,這樣就可以實現正確的回收代碼來創建你的類型和妥善處理異常(查看原則47)。 成員變量初始化語法是保證是初始化的無論哪個構造函數被調用的最簡單方法。初始化語法都在每個構造函數之前執行。使用這個語法意味著你不會因新版本中添加的構造函數而忘記初始化。當所有構造函數以相同方式創建成員變量時,使用初始化語法;這易于閱讀,更易于維護。 ①:initializer 翻譯為初始化語法 小結: 昨晚一直狀態不好,就沒有寫下去,還好這個原則比較簡短,就借用早餐+午休的時間完成了。這個原則建議我們要使用初始化語法來初始化成員變量,這樣既簡單又便于維護,不過除了上面說的三種情況之外。 歡迎各種不爽,各種噴,寫這個純屬個人愛好,秉持”分享“之德! 有關本書的其他章節翻譯請[點擊查看](/category/297763),轉載請注明出處,尊重原創! 如果您對D.S.Qiu有任何建議或意見可以在文章后面評論,或者發郵件(gd.s.qiu@gmail.com)交流,您的鼓勵和支持是我前進的動力,希望能有更多更好的分享。 轉載請在**文首**注明出處:[http://dsqiu.iteye.com/blog/1987663](/blog/1987663) 更多精彩請關注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>

                              哎呀哎呀视频在线观看