C# 語言習慣

來源:互聯網
上載者:User

標籤:public   字串   null   

一、使用屬性而不是可訪問的資料成員

 

二、使用運行時常量(readonly)而不是編譯時間常量(const)

  1. C# 有兩種類型的常量:編譯時間常量和運行時常量。

  2.盡量使用運行時常量,而不是編譯時間常量。

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="border:none;margin:0px;padding:0px;" />

        /// <summary>        /// 編譯時間常量        /// </summary>        public const int Num = 100;        /// <summary>        /// 運行時常量        /// </summary>        public static readonly int Year = 2017;

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="border:none;margin:0px;padding:0px;" />

  3.編譯時間常量只能用於數字和字串,運行時常量也是一種常量,因為在建構函式執行後它不能被再次修改。

  4.const 比 readonly 效率高,但靈活性低。

 

三、推薦使用 is 或 as 操作符而不是強制類型轉換

  1.as 比強轉更加高效、安全。

  2.as 操作符不能配合實值型別使用,因為實值型別永遠不可能為 null。

 

四、使用 Conditional 特性而不是 #if 條件編譯

 

五、為類型提供 ToString() 方法

  1.應該為類型提供一個合適的 ToString() 版本,否則使用者會根據類的一些屬性來自行構造並用於顯示。

  2.object 預設提供的 ToString() 方法會傳回型別的完整名稱,意義不大。如:System.Drawing.Rect。

  3.重寫所有類型的 ToString(),可以簡單明了的顯示對象的摘要資訊。

 

六、理解幾個等同性判斷之間的關係

  1.系統提供 4 種函數判斷兩個對象是否“相等”。

650) this.width=650;" src="http://images2015.cnblogs.com/blog/711762/201704/711762-20170423220203351-2119021352.png" style="border:0px;height:auto;margin:0px auto;padding:0px;" />

  2.對於前兩種方法,我們永遠不要重新定義,我們通常要重寫 Equals 方法。

  3.重寫 Equals 的類型也要實現 IEquatable<T>,如果是結構體的話需要實現 IStructuralEquatable。

  4.引用同一個 DataRow,會認為相等,如果想比較內容的話,而不是引用地址,那麼就應該重寫 Equals() 執行個體方法。

  5.Equals() 執行個體方法的重寫原則:對於所有的實值型別,都應該重寫 Equals() 方法,對於參考型別,如果不能滿足需要時才去重寫該方法。重寫該方法的同時也需要重寫 GetHashCode() 方法。

  6.operator == ():只要建立的是實值型別,都必須重新定義 operator == (),因為系統預設是通過反射來比較兩個值是否相等,效率過低。

 

七、理解 GetHashCode() 的陷阱

  1.對於我們實現的大多數類型來說,避免實現 GetHashCode()。

  2.GetHashCode() 的重載版本必須遵循以下三條原則:

  (1)如果兩個對象相等(由 operator == 定義),那麼它們必鬚生成相同的散列碼。

  (2)對於任何一個對象 A,A.GetHashCode() 必須保持不變。

  (3)對於所有的輸入,散列函數應該在所有整數中按照隨機分布產生散列碼。

 

八、推薦使用查詢文法而不是迴圈

  樣本:

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="border:none;margin:0px;padding:0px;" />

            //1.使用迴圈            var foo = new int[100];            for (int i = 0; i < 100; i++)            {                foo[i] = i * i;            }            //使用查詢文法            var foo2 = (from n in Enumerable.Range(0, 100) select n * n).ToArray();

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="border:none;margin:0px;padding:0px;" />

  1.有些方法文法沒有對應的查詢文法,如 Take、TaskWhile、Skip、SkipWhile、Min、Max 等,就需要使用方法文法。

 

九、避免在 API 中使用轉換操作符

 

十、使用選擇性參數減少方法重載的數量

  1.對於程式集的第一次發布,可以隨意使用選擇性參數和具名引數。而在進行後續發布時,必須為額外的參數建立重載。這樣才能保證現在的程式仍能正常運行。此外,在任何的後續發布中,都要避免修改參數的名稱,因為參數名稱已經成為公有介面的一部分。

 

十一、理解短小方法的優勢

  1.我們最好儘可能地編寫出最清晰的代碼,將最佳化工作交給 JIT 完成。一個常見的錯誤最佳化是,我們將大量的邏輯放在一個函數中,以為這樣可以減少額外的方法調用開銷。

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="border:none;margin:0px;padding:0px;" />

        public string Test(bool isTrue)        {            var sb = new StringBuilder();            if (isTrue)            {                sb.AppendLine("A");                sb.AppendLine("B");                sb.AppendLine("C");            }            else            {                sb.AppendLine("E");                sb.AppendLine("F");                sb.AppendLine("G");            }            return sb.ToString();        }

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="border:none;margin:0px;padding:0px;" />

  在第一次調用 Test 方法時, if-else 的兩個分支都被 JIT 編譯,而實際上只需要編譯其中一個,修改後:

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="border:none;margin:0px;padding:0px;" />

        public string Test2(bool isTrue)        {            var sb = new StringBuilder();            if (isTrue)            {                return Method1();            }            else            {                return Method2();            }        }

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="border:none;margin:0px;padding:0px;" />

  現在進行了方法拆分,這兩個方法就可以根據需要進行 JIT 編譯,而不必第一次進行全部編譯。

  2.可以將 if-else 分支中有超過幾十條的語句,或者某個分支專門用來處理常式發生的錯誤,或者 switch 語句中的每個 case 中的代碼進行選擇性的提取。

  3.短小精悍的方法(一般包含較少的局部變數)會讓 JIT 更容易地進行寄存器選擇工作,即選擇哪些局部變數放在寄存器中,而不是棧上。

  4.盡量編寫短小精悍的方法。


C# 語言習慣

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.