天天看點

編寫高品質代碼改善C#程式的157個建議[泛型集合、選擇集合、集合的安全]

前言

    軟體開發過程中,不可避免會用到集合,C#中的集合表現為數組和若幹集合類。不管是數組還是集合類,它們都有各自的優缺點。如何使用好集合是我們在開發過程中必須掌握的技巧。不要小看這些技巧,一旦在開發中使用了錯誤的集合或針對集合的方法,應用程式将會背離你的預想而運作。

  建議20、使用泛型集合來替代非泛型集合

  建議21、選擇正确的集合

  建議22、確定集合的線性安全

建議20、使用泛型集合來替代非泛型集合

1、提供了類型安全,在編譯期間就可以檢查錯誤

2、更重要的是大部分情況下泛型集合的性能比非泛型集合的性能都高很多。

下面我們來看一段簡單的測試性能的代碼:

執行結果如下

編寫高品質代碼改善C#程式的157個建議[泛型集合、選擇集合、集合的安全]

   我上面測試的次數是10000000,可以發現,兩者在垃圾回收次數和耗時都差距比較大,是以泛型集合有着非泛型集合無法超越的優勢。是以還是盡量在我們的程式中使用泛型集合吧。

建議21、選擇正确的集合

如果集合的數目固定并且不涉及轉型,使用數組效率高,否則就是使用List<T>。

像使用數組、ArrayList、List<T>、Dictionary<key,value>這些集合的有點就是插入和删除資料效率比較高,缺點就是查找的效率相對來說低一些。

建議22、確定集合的線性安全

   建議18中提到,foreach循環不能代替for循環的一個原因是在疊代過程中對集合本身進行了增删操作。将此場景移植到多線程場景中,就是本建議要闡述的重點:確定集合的線程安全。集合線程安全是指在多個線程上添加活删除元素時,線程之間必須保持同步。

  下面我們來通過執行個體來更詳細的檢視一下,先簡單定義一個實體類

再來簡單分析一下這段代碼,其實就是閑定義了一個List集合,然後又定義了一個 AutoRestEvent的執行個體,用于控制線程的。

接下來在Main函數中定義了兩個線程,線上程一中将線程一暫停,然後當調用線程二的時候再來通知線程一繼續運作。最終運作結果

編寫高品質代碼改善C#程式的157個建議[泛型集合、選擇集合、集合的安全]

主要是因為線程一在暫停之後,開始運作線程二随即線程一得到通知可以繼續運作,通過代碼可以發現都有Thread.Sleep(1000);也就是為了保證兩個線程都還在運作期間,線程二移除了集合中的一個元素,那麼當線程一再次循環的時候,導緻了錯誤的發生。

早在泛型集合出現之前,非泛型集合一般會提供一個SyncRoot屬性,要保證非泛型集合的線程安全,可以通過鎖定該屬性來實作。如果上面的集合用ArrayList代替,保證線程安全則應該在疊代和删除的時候都加上鎖lock,代碼如下所示:

運作結果就是線程一執行通過

編寫高品質代碼改善C#程式的157個建議[泛型集合、選擇集合、集合的安全]

如果你試過,那麼會發現泛型集合沒有這樣的屬性來進行加鎖,必須要自己建立一個鎖定對象來完成同步的任務。

是以第一個例子我們可以這樣進行修改

英語小貼士

blind date——相親

online session——線上會議

This depends on you ——這取決于你

I have a date with you——我和你有個約會

poor guy——可憐的家夥,也可以說成(a poor fish)

You look so tall——你看上去很高(形容人高不要用high)

Awesome——令人敬畏的; 使人畏懼的; 可怕的; 極好的

Awesome——聽某某說也可以翻譯成(So.Diao)

感謝您的閱讀,如果您對我的部落格所講述的内容有興趣,那不妨點個推薦吧,謝謝支援:-O。