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

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 原則10:使用默認參數減少函數的重載 **By D.S.Qiu** 尊重他人的勞動,**支持原創,轉載請注明[出處](/blog/1986910):[http://dsqiu.iteye.com](http://dsqiu.iteye.com)** C# 現在已經在函數調用上支持命名參數了。這意味著名字形式的參數是你的類 public 接口的一部分。改變 public 參數的名字將破壞函數調用代碼。這意味著很多時候要避免使用命名參數,或者避免改變 public 或 protected 方法的命名參數的名字。 當然,沒有一個語言設計者增加的特性會增加你的難度。命名參數和默認參數防止了很多 API 的多而雜亂,特別是 Microsoft Office 的 COM API 。下面這段代碼使用 COM 類的方法創建 Word 文檔并插入一小段文本: ``` var wasted = Type.Missing; var wordApp = new Microsoft.Office.Interop.Word. Application(); wordApp.Visible = true; Documents docs = wordApp.Documents; Document doc = docs.Add(ref wasted, ref wasted, ref wasted, ref wasted); Range range = doc.Range(0, 0); range.InsertAfter("Testing, testing, testing. . ."); ``` 這段代碼使用了小而沒用的 Type.Missing 對象次數。很多 Office Interop 應用都會使用大量的 Type.Missing 對象。這些實例弄混了你的應用并隱藏了你構建軟件的實際邏輯。 在 C# 語言中,這個混亂只要是因為添加了默認參數和命名參數導致的。默認參數意味著意味著這些 Office API 可以使用默認值對那些所有使用 Type.Missing 的地方。簡化上面的小段代碼: ``` var wordApp = new Microsoft.Office.Interop.Word.Application(); wordApp.Visible = true; Documents docs = wordApp.Documents; Document doc = docs.Add(); Range range = doc.Range(0, 0); range.InsertAfter("Testing, testing, testing. . ."); ``` 命名參數的作用是在任何有默認參數的 API 中,你只需要制定你想要使用的參數。這個簡單并省去了多次重載。實際上,四個不同參數,你需要重載15個不同的 Add() 來達到命名參數和默認參數相同的靈活性。記住一些 Office API 有多達16個參數,默認參數和命名參數就是一個很大幫助。 我在參數列表使用 ref 修飾符,但在 C# 4.0的另一個改變就是在 COM 中這是默認的。這是因為 COM ,一般來說,使用對象引用來傳遞參數,所有幾乎所有參數都是按引用來傳遞參數的,即使函數內沒有對參數進行改變。實際上, Range() 調用通過引用傳入值(0,0)的。我們沒有包含 ref 修飾符,因為那將是明顯的誤導。實際,在多少代碼中,我們都沒有包含 ref 修飾符去調用 Add() 。上面我就是這樣做的,你可以去查看下實際的 API 簽名。 當然,僅僅是因為 COM 和 Office API 的命名參數和默認參數,這不意味著你需要限制使用它們在 Office Interop 應用中。實際上,這是不能的。開發者使用命名參數調用你的 API 無論你是否希望他們這么做。 下面的方法: ``` private void SetName(string lastName, string firstName) { //elided } ``` 使用命名參數調用避免命名參數次序的混亂: ``` SetName(lastName: "Wagner", firstName: "Bill"); ``` 注解命名參數保證別人后面看這段代碼不用去想參數的位置是否正確。開發者使用命名參數將閱讀代碼的人的更清晰。當調用的函數有多個相同類型的參數,使用命名參數會使你的代碼更加具有可讀性。 改變參數名字的破壞會表現得很有趣。在 MSIL 中參數名字存儲在函數調用點,而不是函數入口。你可以改變參數名字并且發布的組件不會破壞任何使用這個組件的代碼。使用這個組件的開發者會有一個重要的改變當需要重新編譯升級版本,但之前的版本的客戶端代碼仍然可以正確運行。所以你至少不會破壞已存在的程序集。使用你代碼的開發者會懊惱,但是不會對你抱怨出現的問題。例如,假設你修改 SetName() 的參數名字: ``` public void SetName(string Last, string First); ``` 你將會編譯和發布這個程序集作為一個補丁。任何調用這個方法的程序集都能繼續運行,即使包含了指定參數名字的 SetName 的調用。然而,當客戶端開發者想要升級他們的程序集,像下面的代碼都不會通過編譯: ``` SetName(lastName : "Wanger",firstName : "Bill"); ``` 改變默認參數的值童謠需要調用者重寫編譯保證這個更新一致。如果你編譯你的程序集并發布這個補丁,所有已存在的調用將繼續使用之前的默認值。 當然,你也不會隨意的對使用你的組件的開發者帶來麻煩。所以,你必須把參數的名字當做組件 public 接口的一部分。改變參數名字在客戶端代碼再編譯時會有問題。 此外,增加參數(即使是默認參數)都會在運行時有問題。默認參數的實現跟命名參數是類似的。調用點會包含 MSIL 用于反射出默認值的存在和具體值時多少的注解。函數入口替換調用者沒有明確指定的默認參數的值。 所以,即使增加一個默認參數,都會在運行時出現問題。如果它們有默認參數,在編譯時不會有問題。 至此,經過一番解釋,這個指導應該更加清晰了。為了初始版本的發布,使用默認參數和命名參數可以創造使用者想要得到重載組合。但是,一旦你創建未來的版本,你必須創建額外參數的重載。那樣已經存在的客戶端程序會繼續有效。此外,在任何將來的版本中,避免更改參數名稱。它們現在是你的 public 接口的一部分。 小結: 這篇跨了一個星期,因為自己脖子到現在還是疼的,然后公司搬家,這個星期脖子一直都很痛,加上上班的工作任務也重,會到家就直接洗澡休息了,連續休息了一周感覺還是不錯的,至少臉上的“平靜”了很多,氣色也好了很多,但是又覺得很不心安,感覺荒廢了,我要加油,繼續努力。 歡迎各種不爽,各種噴,寫這個純屬個人愛好,秉持”分享“之德! 有關本書的其他章節翻譯請[點擊查看](/category/297763),轉載請注明出處,尊重原創! 如果您對D.S.Qiu有任何建議或意見可以在文章后面評論,或者發郵件(gd.s.qiu@gmail.com)交流,您的鼓勵和支持是我前進的動力,希望能有更多更好的分享。 轉載請在**文首**注明出處:[http://dsqiu.iteye.com/blog/1986873](/blog/1986873) 更多精彩請關注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>

                              哎呀哎呀视频在线观看