亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

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

2019-11-17 03:14:25
字體:
來源:轉載
供稿:網友

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

前言

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

  本文已更新至http://www.49028c.com/aehyok/p/3624579.html。本文主要學習記錄以下內容:

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

  建議21、選擇正確的集合

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

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

http://www.49028c.com/aehyok/p/3384637.html這里有一篇文章,是我之前專門來介紹泛型的。我們應盡量的使用泛型集合。因為泛型的確有它的好處:

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

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

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

class PRogram    {        static int collectionCount = 0;        static Stopwatch watch = null;        static int testCount = 10000000;        static void TestBegin()        {            GC.Collect(); ////強制對所有代碼進行即時垃圾回收            GC.WaitForPendingFinalizers();////掛起線程,執行終結器隊列中的終結器(即析構方法)            GC.Collect();///再次對所有代碼進行垃圾回收,主要包括從終結器隊列中出來的對象            collectionCount = GC.CollectionCount(0);///返回在0代中執行的垃圾回收次數            watch = new Stopwatch();            watch.Start();        }        static void TestEnd()        {            watch.Stop();            Console.WriteLine("耗時:{0}",watch.ElapsedMilliseconds.ToString());            Console.WriteLine("垃圾回收次數:{0}", GC.CollectionCount(0) - collectionCount);        }        static void TestArrayList()        {            ArrayList arrayList = new ArrayList();            int temp = 0;            for (int i = 0; i < testCount; i++)            {                arrayList.Add(i);                temp = (int)arrayList[i];            }            arrayList = null;        }        static void TestGenericList()        {            List<int> list = new List<int>();            int temp = 0;            for (int i = 0; i < testCount; i++)            {                list.Add(i);                temp = list[i];            }            list = null;        }        static void Main(string[] args)        {            Console.WriteLine("開始測試ArrayList");            TestBegin();            TestArrayList();            TestEnd();            Console.WriteLine("開始測試List<T>");            TestBegin();            TestGenericList();            TestEnd();            Console.ReadLine();        }    }

執行結果如下

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

建議21、選擇正確的集合

http://www.49028c.com/aehyok/p/3643928.html這里有一篇我剛寫的關于集合的博文,主要是簡單介紹了一下關于自己使用比較頻繁的幾個集合。

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

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

關于隊列可以參考http://msdn.microsoft.com/zh-cn/library/System.Collections.Queue(v=vs.80).aspx

關于??梢詤⒖糷ttp://msdn.microsoft.com/zh-cn/library/System.Collections.Stack(v=vs.110).aspx

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

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

  下面我們來通過實例來更詳細的查看一下,先簡單定義一個實體類

    public class Person    {        public string Name { get; set; }        public int Age { get; set; }    }
       static List<Person> list = new List<Person>()         {             new Person(){ Name="aehyok",Age=25},            new Person(){Name="Kris",Age=23},            new Person(){Name="Leo",Age=26}        };        static AutoResetEvent autoSet = new AutoResetEvent(false);        static void Main(string[] args)        {            Thread t1 = new Thread(() =>             {                ///阻止當前線程                autoSet.WaitOne();                   foreach (var item in list)                {                    Console.WriteLine("t1:"+item.Name);                    Thread.Sleep(1000);                }            });            t1.Start();            Thread t2 = new Thread(() =>             {                 ///通知t1可以執行代碼                autoSet.Set();                Thread.Sleep(1000);                list.RemoveAt(2);            });            t2.Start();            Console.ReadLine();        }

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

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

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

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

        static ArrayList list = new ArrayList()         {             new Person(){ Name="aehyok",Age=25},            new Person(){Name="Kris",Age=23},            new Person(){Name="Leo",Age=26}        };        static AutoResetEvent autoSet = new AutoResetEvent(false);        static void Main(string[] args)        {            Thread t1 = new Thread(() =>             {                ///阻止當前線程                autoSet.WaitOne();                lock (list.SyncRoot)                {                    foreach (Person item in list)                    {                        Console.WriteLine("t1:" + item.Name);                        Thread.Sleep(1000);                    }                }            });            t1.Start();            Thread t2 = new Thread(() =>             {                 ///通知t1可以執行代碼                autoSet.Set();                Thread.Sleep(1000);                lock (list.SyncRoot)                {                    list.RemoveAt(2);                }                            });            t2.Start();            Console.ReadLine();        }

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

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

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

 static List<Person> list = new List<Person>()         {             new Person(){ Name="aehyok",Age=25},            new Person(){Name="Kris",Age=23},            new Person(){Name="Leo",Age=26}        };        static object SyncObject = new object();        static AutoResetEvent autoSet = new AutoResetEvent(false);        static void Main(string[] args)        {            Thread t1 = new Thread(() =>             {                ///阻止當前線程                autoSet.WaitOne();                lock (SyncObject)                {                    foreach (var item in list)                    {                        Console.WriteLine("t1:" + item.Name);                        Thread.Sleep(1000);                    }                }            });            t1.Start();            Thread t2 = new Thread(() =>             {                 ///通知t1可以執行代碼                autoSet.Set();                Thread.Sleep(1000);                lock (SyncObject)                {                    list.RemoveAt(2);                }             });            t2.Start();            Console.ReadLine();        }

英語小貼士

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)

作者:aehyok

出處:http://www.49028c.com/aehyok/

感謝您的閱讀,如果您對我的博客所講述的內容有興趣,那不妨點個推薦吧,謝謝支持:-O。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久免费在线观看| 狠狠久久五月精品中文字幕| 96pao国产成视频永久免费| 欧美成人性色生活仑片| 美女黄色丝袜一区| 国产精品一区二区三区毛片淫片| 国产精品亚洲第一区| 国产成人精品一区二区| 久久久99久久精品女同性| 国产精品高清在线观看| 日韩精品中文字幕在线播放| 精品国产91久久久| 色妞色视频一区二区三区四区| 91精品国产91久久| 久久精品美女视频网站| 宅男66日本亚洲欧美视频| 91免费版网站入口| 狠狠躁夜夜躁人人躁婷婷91| 日韩美女激情视频| 亚洲人线精品午夜| 亚洲男子天堂网| 秋霞av国产精品一区| 欧美日韩亚洲一区二区| 欧美精品999| 亚洲午夜性刺激影院| 久久精品国产免费观看| 91av免费观看91av精品在线| 久热精品视频在线观看一区| 在线视频日本亚洲性| 亚洲电影免费观看高清完整版| 亚洲欧美国产精品久久久久久久| 欧美成人免费网| 国产精品99一区| 亚洲欧美日本伦理| 久久久久久久久久久免费精品| 国产精品电影一区| 欧美一区二区大胆人体摄影专业网站| 日韩欧美国产黄色| 亚洲免费电影在线观看| 韩国日本不卡在线| 国产精品福利在线观看网址| 欧美精品在线免费播放| 精品福利免费观看| 久久高清视频免费| 亚洲国产福利在线| 亚洲人精选亚洲人成在线| 国产精品高清网站| www.日韩.com| 国产激情久久久| 91av在线视频观看| 欧美日韩一区二区在线| 清纯唯美亚洲综合| 久久99青青精品免费观看| 国产精品一二三视频| 中文字幕无线精品亚洲乱码一区| 精品久久久久久中文字幕大豆网| 欧美电影电视剧在线观看| 欧美激情一区二区三区久久久| 岛国av在线不卡| 91精品国产91久久久久久吃药| 视频在线一区二区| 不卡在线观看电视剧完整版| 日韩欧美中文在线| 亚洲第五色综合网| 91po在线观看91精品国产性色| 国产精品r级在线| 日韩福利视频在线观看| 欧美日韩激情视频| 91九色综合久久| 久久精品视频99| 日韩中文在线中文网三级| 亚洲精选一区二区| 日韩亚洲成人av在线| 91在线视频免费| 岛国精品视频在线播放| 国产精品久久久久久久久| 欧美一区在线直播| 久久久久久av| 日韩国产欧美精品一区二区三区| 亚洲国产精品yw在线观看| 97在线观看免费高清| 伊人av综合网| 欧美麻豆久久久久久中文| 国产精品白丝av嫩草影院| 66m—66摸成人免费视频| 成人a在线视频| 大荫蒂欧美视频另类xxxx| 2018中文字幕一区二区三区| 久久久久久久一区二区| 91在线观看免费高清| 久久影院中文字幕| 亚洲成人中文字幕| 久久综合免费视频| 午夜精品一区二区三区视频免费看| 亚洲аv电影天堂网| 欧美激情视频网址| 国产精品在线看| 国产性猛交xxxx免费看久久| 操91在线视频| 精品视频中文字幕| 亚洲精品日韩丝袜精品| 亚洲国产精品国自产拍av秋霞| 久久夜色精品国产| 欧美成人手机在线| 亚洲精品xxx| 欧美日韩亚洲系列| 久久精品国产一区二区电影| 97超级碰碰碰久久久| 国产一区二区三区高清在线观看| 国产女人精品视频| 亚洲高清不卡av| 欧美在线视频网| 亚洲国产欧美一区二区三区久久| 久久手机精品视频| 91视频国产高清| 精品综合久久久久久97| 亚洲毛片在线免费观看| 国产热re99久久6国产精品| 日韩欧美亚洲范冰冰与中字| 91精品国产高清久久久久久91| 久久精品国产亚洲精品2020| 隔壁老王国产在线精品| 久色乳综合思思在线视频| 亚洲第一中文字幕在线观看| 国产热re99久久6国产精品| 久久九九热免费视频| 久久久精品电影| 久久久91精品国产一区不卡| 亚洲第一天堂无码专区| 久久精品视频va| 九九热这里只有精品免费看| 有码中文亚洲精品| 亚洲女人被黑人巨大进入| 91国产美女在线观看| 亚洲新中文字幕| 久久精品色欧美aⅴ一区二区| 亚洲免费精彩视频| 欧美巨猛xxxx猛交黑人97人| 北条麻妃在线一区二区| 日本在线观看天堂男亚洲| 欧美激情影音先锋| 日韩理论片久久| 欧美日韩在线另类| 国内精品视频久久| 亚洲二区在线播放视频| 亚洲国产精品久久久久| 国产69精品久久久久9999| 91九色单男在线观看| 中文字幕无线精品亚洲乱码一区| 亚洲在线一区二区| 在线丨暗呦小u女国产精品| 日韩精品日韩在线观看| 精品magnet| 欧美大片大片在线播放| 国产日韩在线视频| 日韩色av导航| 亚洲专区国产精品| 国内精品视频在线| 国产日韩欧美另类| 日韩视频在线免费观看| 国产成人综合亚洲| 欧美成人久久久| 国产99久久精品一区二区| 欧美理论电影在线观看|