泛型優缺點

它有什麼優點?它對性能有影響嗎?它在執行時的行爲是什麼?.NET BCL中有哪些泛型類型?舉例說明平時編程中您定義的泛型類型。  泛型的做用在於「算法的重用」。(這點其實很好理解,原來的ArrayList只能接受Object,如今經過List能夠接受任何類型,也就是說ArrayList的方法都被各個類型重用了。可是Dot Net的泛型有個比較制肘地方,就是你很難對數值類型(值類型)進行算法抽象,由於這牽涉到運算符重載的問題,同時Dot Net的泛型的類型參數也不能約束成一個基元值類型(如int、double、float) 。) 它有什麼優點? 第一:源代碼保護。(若是你知道C++模板對泛型的實現機制,就會知道C++在編譯的時候根據對泛型的調用,自動「內聯」了一個實現,這樣泛型的內容就暴露了,爾DotNet的實現方式就不一樣了,泛型類和方法會被編譯成IL,在執行的時候由JIT負責將IL變化爲指定類型參數的本地代碼,從而保護了源代碼) 第二:類型安全。(這點是最顯而易見的,拋棄了使用ArrayList時各類醜陋的強制類型轉換) 第三:更清晰地代碼。由於沒有了強制類型轉換,因此代碼天然顯得更清晰,可是使用泛型時候帶來的<>有時候確實也會讓人搞糊塗,幸虧泛型方法能夠用類型推斷或者using語句來進一步簡化寫法。 第四:更好的性能,由於值類型能夠避免裝箱和拆箱所帶來的損耗(垃圾回收的次數也會減小)。(這點正是泛型神奇的地方,開發歷史上抽象能力的上升每每意味着性能的降低,可是泛型卻不是!泛型抽象了算法,可是C++和DotNet對泛型的實現可以讓性能無損,而且更快。Java的擦除法泛型就沒有這種性能上的好處。) 它對性能有影響嗎? 對性能有積極的影響,由於值類型能夠避免裝箱和拆箱所帶來的負面影響,避免了垃圾回收,使得性能顯著提升。可是對引用類型這種影響就不明顯了。可是須要注意的是首次爲一個特定數據類型調用方法時,CLR都會爲這個方法生成本地代碼。這會增

搜索

大應用程序的工做集大小,從而影響性能。 它在執行時的行爲是什麼? 使用泛型類型參數的一個方法在進行JIT編譯時,CLR獲取IL,用指定的類型實參進行替換,而後建立本地代碼。須要特別注意的是引用類型是共享代碼的,而對值類型就會爲每一種生成獨立的一份類型代碼。可是須要指出的是引用類型的這種代碼共享並不會形成封閉類型只執行一次構造函數(就算是靜態構造函數也是這樣的)。 .NET BCL中有哪些泛型類型? List、Dictionary、Queue、Stack、SortedList和SortedDictionary、LinkedList等等。 舉例說明平時編程中您定義的泛型類型。泛型的出現會替換原來一部分使用多態的地方從而提升性能和帶來更好的編譯時檢查,這樣就不須要在子類和超類(接口)間頻繁轉換了。
相關文章
相關標籤/搜索