C# 開發者最經常犯的 8 個錯誤

原文地址:http://blog.goyello.com/2013/01/07/8-most-common-mistakes-c-developers-make/


在和C#新手一起工作的時候,我注意到他們經常重複一些錯誤。這些錯誤,當你指出來的時候很容易理解。然而,如果一個開發者沒有意識到這些錯誤,將會影響正在開發的軟件的質量和效率,因此,我決定總結8個常見的錯誤。


1. 使用字符串連接代替StringBuilder

在你向一個字符串追加新字符串的時候,字符串連接方法是可行的。但是這樣會導致新的內存空間被創建。被追加的字符串會拷貝到新的內存單元。這樣的效率很低。而我們使用StringBuilder的話,可以免去字符串拷貝的發生。感謝StringBuilder在連接字符串中帶來的高效率,尤其是在多次追加的操作中。

1 //錯誤寫法
2 List values = new List(){"This ","is ","Sparta ","!"};
3 string outputValue = string.Empty;
4 foreach (var value in values)
5 {
6    outputValue += value;
7 }
1 //正確寫法
2 StringBuilder outputValueBuilder = new StringBuilder();
3 foreach (var value in values)
4 {
5    outputValueBuilder.Append(value);
6 }

2. LINQ - 'Where' 條件中使用 'First', 代替使用 FirstOrDefault

很多程序員在做查找操作的時候喜歡用'Where'操作並通過'First'獲取第一次出現的記錄。這樣的操作是不對的。因爲'First'操作不會在'Where'條件中起到作用。而且,這樣也不能確保記錄一定被找到。如果'First'在沒有記錄返回的操作中使用,系統會返回默認值並且沒有任何異常被拋出。

1 //錯誤的寫法
2 List numbers = new List(){1,4,5,9,11,15,20,21,25,34,55};
3 return numbers.Where(x => Fibonacci.IsInFibonacciSequence(x)).First();
1 //部分正確的寫法
2 return numbers.First(x => Fibonacci.IsInFibonacciSequence(x));
1 //正確的寫法
2 return numbers.FirstOrDefault(x => Fibonacci.IsInFibonacciSequence(x));


3. 當對象不可轉換的場合中,通過'(T)'操作做類型轉化代替使用 'as (T)' 。

對於軟件開發人員來說,使用'(T)' 做類型轉換,而不是使用 'as (T)' 是很常見的寫法。實際上,這樣通常不會帶來危害,因爲多數對象都是可轉換的。但是,如果在很低的可能性還是發生的情況下,對象不能轉換,那麼使用 'as (T)' 纔是正確的。 詳細請查看 Prefix-casting versus as-casting in C# 

1 //錯誤
2 var woman = (Woman)person;
1 //正確
2 var woman = person as Woman;


4.不使用映射重寫屬性

有許多強大的C#映射(例如 AutoMapper)。如果只有幾行代碼來重寫屬性,這絕對可以用映射來代替。即使一些屬性不能直接複製,但總有一些其他的邏輯可以讓映射成爲一個很好的選擇(映射能夠在更大泛圍內定義重寫屬性的規則)。


5.錯誤地重新拋出異常

C#程序員使用“throw ex”來拋出一個異常經常會忘記對棧的跟蹤,會使程序難以調試並且不能形成日誌信息,如果簡單地使用“throw”,那麼數據將不會丟失,並且可以方便地檢索整個異常的堆棧跟蹤。

01 //錯誤
02 try
03 {
04    //some code that can throw exception [...]
05 }
06 catch (Exception ex)
07 {
08    //some exception logic [...]
09    throw ex;
10 }
01 //正確
02 try
03 {
04    //some code that can throw exception [...]
05 }
06 catch (Exception ex)
07 {
08    //some exception logic [...]
09    throw;
10 }

6. 沒有使用 ‘using’ 語句來銷燬對象

很多C#的軟件開發人員竟然不知道關鍵字 'using' 不單單隻用於引入命名空間,而還有回收銷燬對象的功能。如果你明確知道某個對象在進行完某些操作後,不再有用,需要回收,你可以使用'using' 語句來銷燬對象。

01 //以下語句:
02 using(SomeDisposableClass someDisposableObject = new SomeDisposableClass())
03 {
04    someDisposableObject.DoTheJob();
05 }
06 //和以下語句是一樣效果:
07 SomeDisposableClass someDisposableObject = new SomeDisposableClass();
08 try
09 {
10    someDisposableObject.DoTheJob();
11 }
12 finally
13 {
14    someDisposableObject.Dispose();
15 }

7. 除了對象集合外,使用'foreach' 代替 'for'

請牢記除了對象集合之外(例如數組),當你需要進行迭代操作的時候,使用'for' 會比使用 'foreach'效率更高。請參考Foreach vs For Performance 。


8. 對數據庫進行讀取或保存操作的時候,使用多次的DB調用

這是非常常見的錯誤,尤其在初級開發人員當中。特別是在使用ORM框架的時候,例如Entity Framework和NHibernate。每次的DB的調用都會耗費資源,所以對DB的操作越少越好。你可以通過以下方式做到:

  • 使用fetching(貪婪加載)
  • 把DB操作封裝在事務當中
  • 爲了避免複雜的邏輯,可以把業務邏輯封裝到存儲過程中。

可以說,還有C#程序員經常會遇到的錯誤還有很多很多。如果你發現某項是你感興趣的或者你需要分享你的看法,歡迎留下你寶貴的意見。


發佈了90 篇原創文章 · 獲贊 16 · 訪問量 67萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章