1,、正確操作字符串
2、使用默認轉型方法 類型的轉換運算符 :每個類型內部都有一個方法(運算符),分為隱式轉換和顯示轉換,。 自己實現(xiàn)隱式轉換: puclic static implicit operator Ip(string ip)
3,、區(qū)別對待強制轉型與as和is 為了編譯更強壯的代碼,,建議更常使用as和is 什么時候使用as 如果類型之間都上溯到了某個共同的基類,那么根據(jù)此基類進行的轉型(即基類轉型為子類本身)應該使用as,。子類與子類之間的轉型,,則應該提供轉換操作符,以便進行強制轉型,。 as操作符永遠不會拋出異常,,如果類型不匹配(被轉換對象的運行時類型既不是所轉換的目標類型,也不是其派生類型),,或者轉型的源對象為null,,那么轉型之后的值也為null。 什么時候使用is as操作符有一個問題,,即它不能操作基元類型,。如果涉及基元類型的算法,就需要通過is轉型前的類型來進行判斷,,以避免轉型失敗,。 4、TryParse比Parse好 這個肯定好,,不說了,。安全 5、使用int?來確保值類型也可以為null 基元類型為什么需要為null,?考慮兩個場景:
寫法:int ? i=null; 語法T?是Nullable<T>的簡寫,,兩者可以相互轉換??梢詾閚ull的類型表示其基礎值類型正常范圍內的值再加上一個null值,。例如,,Nullable<Int32>,,其值的范圍為-2 147 483 648~2 147 483 647,再加上一個null值,。 ,?經常和?,?配合使用,,比如:
6、區(qū)別readonly和const的使用方法 使用const的理由只有一個,,那就是效率,。之所以說const變量的效率高,是因為經過編譯器編譯后,,我們在代碼中引用const變量的地方會用const變量所對應的實際值來代替,。比如:const=100, const和100被使用的時候是等價,const自帶static光圈,。 const和readonly的本質區(qū)別如下:
注意:在構造方法內,可以多次對readonly賦值,。即在初始化的時候,。 7、將0值作為枚舉的默認值 允許使用的枚舉類型有byte,、sbyte,、short、ushort,、int,、uint、long和ulong,。應該始終將0值作為枚舉類型的默認值,。不過,這樣做不是因為允許使用的枚舉類型在聲明時的默認值是0值,,而是有工程上的意義,。 既然枚舉類型從0開始,,這樣可以避免一個星期多出來一個0值。 8,、避免給枚舉類型的元素提供顯式的值 不要給枚舉設定值,。有時候有某些增加的需要,會為枚舉添加元素,,在這個時候,,就像我們?yōu)槊杜e增加元素ValueTemp一樣,極有可能會一不小心增加一個無效值,。 9,、習慣重載運算符 比如:Salary familyIncome=mikeIncome+roseIncome; 閱讀一目了然。通過使用opera-tor關鍵字定義靜態(tài)成員函數(shù)來重載運算符,,讓開發(fā)人員可以像使用內置基元類型一樣使用該類型,。 10、創(chuàng)建對象時需要考慮是否實現(xiàn)比較器 有特殊需要比較的時候就考慮,。集合排序比較通過linq 也可以解決,。 11、區(qū)別對待==和Equals 無論是操作符“==”還是方法“Equals”,,都傾向于表達這樣一個原則:
注意
12,、重寫Equals時也要重寫GetHashCode 除非考慮到自定義類型會被用作基于散列的集合的鍵值;否則,,不建議重寫Equals方法,,因為這會帶來一系列的問題,。 集合找到值的時候本質上是先去 查找HashCode,然后才查找該對象來比較Equals 注意:重寫Equals方法的同時,也應該實現(xiàn)一個類型安全的接口IEquatable<T>,,比如 :class Person:IEquatable 13,、為類型輸出格式化字符串 有兩種方法可以為類型提供格式化的字符串輸出。
一個典型的格式化器應該繼承接口IFormatProvider和ICustomFomatter 14、正確實現(xiàn)淺拷貝和深拷貝 淺拷貝 將對象中的所有字段復制到新的對象(副本)中,。其中,,值類型字段的值被復制到副本中后,在副本中的修改不會影響到源對象對應的值,。而引用類型的字段被復制到副本中的是引用類型的引用,,而不是引用的對象,在副本中對引用類型的字段值做修改會影響到源對象本身,。 深拷貝 同樣,,將對象中的所有字段復制到新的對象中。不過,,無論是對象的值類型字段,,還是引用類型字段,都會被重新創(chuàng)建并賦值,,對于副本的修改,,不會影響到源對象本身。 無論是淺拷貝還是深拷貝,,微軟都建議用類型繼承IClone-able接口的方式明確告訴調用者:該類型可以被拷貝,。當然,ICloneable接口只提供了一個聲明為Clone的方法,,我們可以根據(jù)需求在Clone方法內實現(xiàn)淺拷貝或深拷貝,。 一個簡單的淺拷貝的實現(xiàn)代碼如下所示: class Employee:ICloneable 注意到Employee的IDCode屬性是string類型。理論上string類型是引用類型,,但是由于該引用類型的特殊性(無論是實現(xiàn)還是語義),,Object.MemberwiseClone方法仍舊為其創(chuàng)建了副本,。也就是說,在淺拷貝過程,,我們應該將字符串看成是值類型,。 一個簡單的深拷貝實現(xiàn)樣例如下(建議使用序列化的形式來進行深拷貝)
同時實現(xiàn)深拷貝和淺拷貝 由于接口ICloneable只有一個模棱兩可的Clone方法,所以,,如果要在一個類中同時實現(xiàn)深拷貝和淺拷貝,,只能由我們自己實現(xiàn)兩個額外的方法,聲明為DeepClone和Shallow,。Em-ployee的最終版本看起來應該像如下的形式: [Serializable] class Employee:ICloneable { 15,、利用dynamic來簡化反射實現(xiàn) dynamic是Framework 4.0的新特性。dynamic的出現(xiàn)讓C#具有了弱語言類型的特性,。編譯器在編譯的時候不再對類型進行檢查,,編譯器默認dynamic對象支持開發(fā)者想要的任何特性。 比如,,即使你對GetDynamicObject方法返回的對象一無所知,,也可以像如下這樣進行代碼的調用,編譯器不會報錯:
當然,,如果運行時dynamicObject不包含指定的這些特性(如上文中帶返回值的方法SampleMethod),,運行時程序會拋出一個RuntimeBinderException異常:“System.Dynamic.ExpandoObject”未包含“Sam-pleMethod”的定義。 var與dynamic有巨大的區(qū)別
反射使用
DynamicSample dynamicSample=new DynamicSample();
建議:始終使用dynamic來簡化反射實現(xiàn)。 總結 在大部分應用情況下,,“效率”并沒有那么高的地位,,靈活性更重要。在部分情況下,,“靈活性”并沒有那么高的地位,,效率最重要。 ●編號326,,輸入編號直達本文 ●輸入m獲取文章目錄 |
|