想要寫出較好的代碼,保證代碼的高質量須要時刻警戒代碼中的壞味道,今天分享一下,我以爲平時寫的代碼中可能會出現的壞味道代碼的一些示例數組
嚴格的來講,這多是一個 BUG 級別的代碼了,最簡單的一個實例,你應該明確你的輸入數據是否是可能爲 null,若是可能爲 null 須要檢查一下,有一些代碼中每每會在代碼中寫下一些坑,明明這個變量是 null
仍是直接用這個變量中的屬性或方法spa
還有一種狀況是明確對象不是 null
的狀況下就不要 null check 或使用 null 傳播符號,下面的這個是一個錯誤示例:code
var list = new List<int>(){1,2,3,-2,3,6,2}; var arr = list?.Where(x=>x>0)?.Where(x=>(x%2)==0)?.ToArray()
上面的代碼裏 list
是不會爲 null
的因此 list
後不須要加 ?
,Where
這個 LINQ 方法是不會返回一個 null
的,因此 Where
後面也是不須要加 ?
的對象
這裏特別想說一下,不少人對象 First
和 FirstOrDefault
的用法有些不清楚,若是能找到數據而且要找到第一個數據就用 First
,若是找不到會有 exception,
而 FirstOrDefault
在不肯定有沒有的時候用它更合適,若是沒有就返回一個默認值。it
代碼中沒有用到的命名空間引用請移除它,避免沒必要要的代碼io
沒有用到的代碼或者被註釋的代碼直接從代碼中刪除,不要保留在代碼庫中,一個是可能會讓人很費解,一個是沒有任何用處class
如今咱們的代碼基本都會使用源代碼版本管理,若是沒有,我建議你使用,這樣能夠保證每次修改都是一個版本,可追溯版本管理
在應用中主動拋異常的時候應該拋出具體的異常,例如參數爲 null
的時候應該拋出 throw new ArgumentNullException("paramName")
而不是 throw new Exception()
變量
還有一些異常應該是系統內部拋出的異常,不該該從用戶代碼中拋出,例如: IndexOutOfRangeException
重構
對於過期的方法,咱們通常會標記一個 [Obsolete]
,標記的同時應該提供一個 message 提示用戶不要使用這個方法或者使用哪個方法代替
抽象類的構造器方法應該是 protected
,由於抽象類是不能實例化的,因此抽象類的構造方法是否是被直接調用的,因此一般來講應該考慮抽象類的構造方法設置爲 protected
抽象類中外部要使用的方法才設置爲 public
,僅內部會用到的成員設置爲 protected 便可,體現封裝特性,最小化訪問權限
方法重載應該放在一塊兒,這樣方便咱們查找代碼,也會更方便了解這個方法的參數
減小方法的複雜度,不要讓一個方法過於複雜,若是太複雜了就可能須要考慮重構了,方法參數不能太多,方法邏輯不要太複雜,詳細能夠參考上一篇文章方法重構分析
IEnumerable<T>
對於 IEnumerable<T>
使用 Any()
來代替 Count()==0
對於數組和列表分別使用 array.Length
和 list.Count
代替 Count()
推薦爲你的 Visual Studio 安裝 CodeMaid 和 ReSharper
使用 CodeMaid 來作代碼整理,一般我會使用 CodeMaid
來自動整理代碼,防止有些地方會有多餘的空格,和自動清理命名空間,除此以外 CodeMaid
還有一個比較讚的功能是在使用 region 來區分代碼塊的時候,CodeMaid
會在 EndRegion 處增長對應的 Region 的描述信息,這樣方法較長,region 較多的狀況下會比較容易區分哪裏是哪一部分的會比較清晰
遵循 ReSharper 的建議編寫更整潔的代碼,ReSharper 會提供不少實用的建議,好比使用新的 C# 語法來簡化代碼,移除沒有使用的變量等不少很實用的建議,按照 ReSharper
的建議咱們就能夠比較輕鬆的寫出比較良好的代碼,有時候 ReSharper
的命名規則可能會於本身的習慣不符,能夠經過定製 editorconfig
來指定命名規範
Resharper 也有代碼整理的,不過我沒用過,習慣了 CodeMaid 了,有興趣的能夠研究一下,一塊兒交流一下哈~~