【進階修鍊】——改善C#程式效能(1)

來源:互聯網
上載者:User

標籤:io   使用   ar   for   sp   c   on   cti   代碼   

    這是一個大綱形式的提點,以便自己可以花較少的時間時常瀏覽。在開發中,多加註意這些有用的建議,讓自己成為一個更優秀的程式員。內容主要來自《編寫高品質代碼-改善C#程式的157個建議》(陸敏技),這本書寫的真的很好,都是些實戰經驗的總結,建議大家購買此書,這其中的建議不光適合於C#,只要你做.NET開發,閱讀此書都會從中受益。同時,如其他書籍和資料有好的建議,我也會不斷更新到這裡。 1, 字串使用。

應避免發生裝箱;避免分配額外的記憶體;考慮使用StringBuilder來替代string。string.Format內部使用了StringBuilder,比較高效。 2, 類型轉換。

主要這幾方面,基元類型(int32,double,string,object等)之間的轉換包括隱式轉換和顯示轉化,自訂類型可以重載運算子實現隱式轉換(implicit);類型本身提供了Prase和TryPrase,或ToDouble、ToDateTime等方法;協助類如System.Convert實現基元類型之間的轉換,System.BitConverter實現基元類型和數組之間的轉換。父子類之間的顯示和隱式轉換。 3, As和Is。

盡量不要用Is判斷後再強制轉換的方式,直接用As運算子可以減少一次轉型。 4, TryParse比Parse高效。

TryParse不會拋出異常,如果在迴圈中用Parse,頻繁出現異常時會大大損害效能。 5, 使用int?確保實值型別可以為null。

實值型別可以隱式轉換為可空實值型別。判斷可空類型是否包含值可以用HasValue方法測試,還可以用??運算子簡化代碼。 6, Readonly和const。

const是一個編譯期常量,readonly是一個運行時常量。Const只能修飾基元類型、枚舉類型和字串類型;readonly可以修飾任何類型。Const天生就是static的,不用添加static修飾符。Readonly比const有更好的靈活性,但效能略有損失,比起這點效能損失,更推薦用readonly。 7, 將0值作為枚舉類型的預設值。

枚舉類型在聲明時預設值是0,如果0值沒有對應相應的枚舉值將喪失業務意義。 8, 避免給枚舉元素提供顯示的值。

因為如何想在枚舉的中間添加一個元素,不得不重新修改後面所有元素的值。這種情況有一個例外是應用了FlagAttribute的枚舉,可以顯示賦值。 9, 習慣重載運算子。

如果自己設計的類有加法意義,應該用operator關鍵字重載+運算子,使使用者使用更加自然。 10, 建立對象時考慮是否實現比較子。

如果對象要用於排序,應該實現IComparable介面。如果想改變這種預設的排序策略,也可以自訂類實現ICompare介面,後者無需去改變類型的結構,而是添加一個新類來實現,更加靈活。 11, 區別對待==和Equals。

這兩個運算子都可以被重載,但都應該保證這樣的語義:對於實值型別,如果類型的值相等,都應該返回true;對於參考型別,如果類型指向同一個對象,都應返回true。對於自訂的類型,如有必要,可以重寫Equals方法保證值相等就返回true。但一般不重載==,使其保留引用相等性的判斷。另外,要判斷兩個對象是否是同一個對象,可以用Object.ReferenceEquals方法。 12, 重寫Equals時要重寫GetHashCode。

這是因為一些基於散列值的集合,如Hashtable,Dictionary等,會用到Key的HashCode值來尋找Value值。既然Equals的含義被重寫了,那麼HashCode也應該與其保持一致。 13, 為類型輸出格式化字串。

一種是讓類型繼承IFormatable介面,另一種是自訂格式化器,需要實現IFormatProvider和ICustomFormatter。後者的實現更加靈活。 14, 淺拷貝和深拷貝。

這兩種拷貝都應繼承ICloneable介面來實現。淺拷貝可以用this.MemberwiseClone方法。深拷貝可以用BinaryFormatter將對象序列化到MemoryStream後,再還原序列化成對象。如果在一個類中要同時實現淺拷貝和深拷貝,可以添加DeepClone和ShadowClone兩個方法加以區分。

使用dynamic來簡化反射的調用。Dynamic是.net 4.0引入的一個新特性,編譯器不會對dynamic類型的變數進行檢查,我們可以在dynamic的變數上調用方法,檢查屬性值,而不必寫繁瑣的反射代碼。Var關鍵字只是一個文法糖,編譯器編譯後會替換成具體的變數類型,而dynamic被編譯後,會轉換成object類型,對方法和屬性等的調用C#內部本質還是用反射來做的,但這大大減輕了程式員的工作量。

【進階修鍊】——改善C#程式效能(1)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.