原文地址:http://blog.goyello.com/2013/01/07/8-most-common-mistakes-c-developers-make/
在和C#新手一起工作的時候,我注意到他們經常重複一些錯誤。這些錯誤,當你指出來的時候很容易理解。然而,如果一個開發者沒有意識到這些錯誤,將會影響正在開發的軟件的質量和效率,因此,我決定總結8個常見的錯誤。
1. 使用字符串連接代替StringBuilder
在你向一個字符串追加新字符串的時候,字符串連接方法是可行的。但是這樣會導致新的內存空間被創建。被追加的字符串會拷貝到新的內存單元。這樣的效率很低。而我們使用StringBuilder的話,可以免去字符串拷貝的發生。感謝StringBuilder在連接字符串中帶來的高效率,尤其是在多次追加的操作中。
2 |
List
values = new List(){ "This
" , "is
" , "Sparta
" , "!" }; |
3 |
string outputValue
= string .Empty; |
4 |
foreach (var
value in values) |
2 |
StringBuilder
outputValueBuilder = new StringBuilder(); |
3 |
foreach (var
value in values) |
5 |
outputValueBuilder.Append(value); |
2. LINQ - 'Where' 條件中使用 'First', 代替使用 FirstOrDefault
很多程序員在做查找操作的時候喜歡用'Where'操作並通過'First'獲取第一次出現的記錄。這樣的操作是不對的。因爲'First'操作不會在'Where'條件中起到作用。而且,這樣也不能確保記錄一定被找到。如果'First'在沒有記錄返回的操作中使用,系統會返回默認值並且沒有任何異常被拋出。
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(); |
2 |
return numbers.First(x
=> Fibonacci.IsInFibonacciSequence(x)); |
2 |
return numbers.FirstOrDefault(x
=> Fibonacci.IsInFibonacciSequence(x));
|
3. 當對象不可轉換的場合中,通過'(T)'操作做類型轉化代替使用 'as (T)' 。
對於軟件開發人員來說,使用'(T)' 做類型轉換,而不是使用 'as (T)' 是很常見的寫法。實際上,這樣通常不會帶來危害,因爲多數對象都是可轉換的。但是,如果在很低的可能性還是發生的情況下,對象不能轉換,那麼使用 'as (T)' 纔是正確的。 詳細請查看 Prefix-casting
versus as-casting in C#
2 |
var
woman = (Woman)person; |
2 |
var
woman = person as Woman;
|
4.不使用映射重寫屬性
有許多強大的C#映射(例如 AutoMapper)。如果只有幾行代碼來重寫屬性,這絕對可以用映射來代替。即使一些屬性不能直接複製,但總有一些其他的邏輯可以讓映射成爲一個很好的選擇(映射能夠在更大泛圍內定義重寫屬性的規則)。
5.錯誤地重新拋出異常
C#程序員使用“throw ex”來拋出一個異常經常會忘記對棧的跟蹤,會使程序難以調試並且不能形成日誌信息,如果簡單地使用“throw”,那麼數據將不會丟失,並且可以方便地檢索整個異常的堆棧跟蹤。
6. 沒有使用 ‘using’ 語句來銷燬對象
很多C#的軟件開發人員竟然不知道關鍵字 'using' 不單單隻用於引入命名空間,而還有回收銷燬對象的功能。如果你明確知道某個對象在進行完某些操作後,不再有用,需要回收,你可以使用'using' 語句來銷燬對象。
02 |
using (SomeDisposableClass
someDisposableObject = new SomeDisposableClass()) |
04 |
someDisposableObject.DoTheJob(); |
07 |
SomeDisposableClass
someDisposableObject = new SomeDisposableClass(); |
10 |
someDisposableObject.DoTheJob(); |
14 |
someDisposableObject.Dispose(); |
7. 除了對象集合外,使用'foreach' 代替 'for'
請牢記除了對象集合之外(例如數組),當你需要進行迭代操作的時候,使用'for' 會比使用 'foreach'效率更高。請參考Foreach vs For Performance 。
8. 對數據庫進行讀取或保存操作的時候,使用多次的DB調用
這是非常常見的錯誤,尤其在初級開發人員當中。特別是在使用ORM框架的時候,例如Entity Framework和NHibernate。每次的DB的調用都會耗費資源,所以對DB的操作越少越好。你可以通過以下方式做到:
- 使用fetching(貪婪加載)
- 把DB操作封裝在事務當中
- 爲了避免複雜的邏輯,可以把業務邏輯封裝到存儲過程中。
可以說,還有C#程序員經常會遇到的錯誤還有很多很多。如果你發現某項是你感興趣的或者你需要分享你的看法,歡迎留下你寶貴的意見。