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

首頁 > 編程 > C# > 正文

淺談C#泛型的用處與特點

2020-01-24 03:09:13
字體:
來源:轉載
供稿:網友
泛型是 2.0 版 C# 語言和公共語言運行庫 (CLR) 中的一個新功能。泛型將類型參數的概念引入 .NET Framework,類型參數使得設計如下類和方法成為可能:這些類和方法將一個或多個類型的指定推遲到客戶端代碼聲明并實例化該類或方法的時候。例如,通過使用泛型類型參數 T,您可以編寫其他客戶端代碼能夠使用的單個類,而不致引入運行時強制轉換或裝箱操作的成本或風險,如下所示:

復制代碼 代碼如下:

// Declare the generic class
public class GenericList<T>
{
void Add(T input) { }
}
class TestGenericList
{
private class ExampleClass { }
static void Main()
{
// Declare a list of type int
GenericList<int> list1 = new GenericList<int>();
// Declare a list of type string
GenericList<string> list2 = new GenericList<string>();
// Declare a list of type ExampleClass
GenericList<ExampleClass> list3 = new GenericList<ExampleClass>();
}
}


使用泛型類型可以最大限度地重用代碼、保護類型的安全以及提高性能。
泛型最常見的用途是創建集合類。
.NET Framework 類庫在 System.Collections.Generic 命名空間中包含幾個新的泛型集合類。應盡可能地使用這些類來代替普通的類,如 System.Collections 命名空間中的 ArrayList。
您可以創建自己的泛型接口、泛型類、泛型方法、泛型事件和泛型委托。
可以對泛型類進行約束以訪問特定數據類型的方法。
關于泛型數據類型中使用的類型的信息可在運行時通過反射獲取。

為什么要使用C#泛型?

為了了解這個問題,我們先看下面的代碼,代碼省略了一些內容,但功能是實現一個棧,這個棧只能處理int數據類型:

復制代碼 代碼如下:

publicclassStack
{
privateint[]m_item;
publicintPop(){...}
publicvoidPush(intitem){...}
publicStack(inti)
{
this.m_item=newint[i];
}
}

上面代碼運行的很好,但是,當我們需要一個棧來保存string類型時,該怎么辦呢?很多人都會想到把上面的代碼復制一份,把int改成string不就行了。當然,這樣做本身是沒有任何問題的,但一個優秀的程序是不會這樣做的,因為他想到若以后再需要long、Node類型的棧該怎樣做呢?還要再復制嗎?優秀的程序員會想到用一個通用的數據類型object來實現這個棧:

復制代碼 代碼如下:

publicclassStack
{
privateobject[]m_item;
publicobjectPop(){...}
publicvoidPush(objectitem){...}
publicStack(inti)
{
this.m_item=new[i];
}
}

這個棧寫的不錯,他非常靈活,可以接收任何數據類型,可以說是一勞永逸。但全面地講,也不是沒有缺陷的,主要表現在:

當Stack處理值類型時,會出現裝箱、折箱操作,這將在托管堆上分配和回收大量的變量,若數據量大,則性能損失非常嚴重。

在處理引用類型時,雖然沒有裝箱和折箱操作,但將用到數據類型的強制轉換操作,增加處理器的負擔。

在數據類型的強制轉換上還有更嚴重的問題(假設stack是Stack的一個實例):

復制代碼 代碼如下:

Node1x=newNode1();
stack.Push(x);
Node2y=(Node2)stack.Pop();

上面的代碼在編譯時是完全沒問題的,但由于Push了一個Node1類型的數據,但在Pop時卻要求轉換為Node2類型,這將出現程序運行時的類型轉換異常,但卻逃離了編譯器的檢查。

針對object類型棧的問題,我們引入泛型,他可以優雅地解決這些問題。泛型用用一個通過的數據類型T來代替object,在類實例化時指定T的類型,運行時(Runtime)自動編譯為本地代碼,運行效率和代碼質量都有很大提高,并且保證數據類型安全。

使用C#泛型

下面是用泛型來重寫上面的棧,用一個通用的數據類型T來作為一個占位符,等待在實例化時用一個實際的類型來代替。讓我們來看看泛型的威力:

復制代碼 代碼如下:

publicclassStack
{
privateT[]m_item;
publicTPop(){...}
publicvoidPush(Titem){...}
publicStack(inti)
{
this.m_item=newT[i];
}
}

類的寫法不變,只是引入了通用數據類型T就可以適用于任何數據類型,并且類型安全的。這個類的調用方法:

復制代碼 代碼如下:

//實例化只能保存int類型的類
Stacka=newStack(100);
a.Push(10);
a.Push("8888");//這一行編譯不通過,因為類a只接收int類型的數據
intx=a.Pop();
//實例化只能保存string類型的類
Stackb=newStack(100);
b.Push(10);//這一行編譯不通過,因為類b只接收string類型的數據
b.Push("8888");
stringy=b.Pop();

這個類和object實現的類有截然不同的區別:

1.他是類型安全的。實例化了int類型的棧,就不能處理string類型的數據,其他數據類型也一樣。

2.無需裝箱和折箱。這個類在實例化時,按照所傳入的數據類型生成本地代碼,本地代碼數據類型已確定,所以無需裝箱和折箱。

3.無需類型轉換。

理論知識:

所謂泛型:即通過參數化類型來實現在同一份代碼上操作多種數據類型。泛型編程是一種編程范式,它利用“參數化類型”將類型抽象化,從而實現更為靈活的復用。

C#泛型賦予了代碼更強的類型安全,更好的復用,更高的效率,更清晰的約束。

C#泛型能力由CLR在運行時支持,區別于C++的編譯時模板機制,和java的編譯時的“搽拭法”。這使得泛型能力可以在各個支持CLR的語言之間進行無縫的互操作。

C#泛型代碼在被編譯為IL和元數據時,采用特殊的占位符來表示泛型類型,并用專有的IL指令支持泛型操作。而真正的泛型實例化工作以“on-demand”的方式,發生在JIT編譯時。

C#泛型編譯機制如下:

第一輪編譯時,編譯器只為Stack類型產生“泛型版”的IL代碼和元數據,并不進行泛型類型的實例化,T在中間只充當占位符。

JIT編譯時,當JIT編譯器第一次遇到Stack時,將用int類型替換“泛型版”IL代碼與元數據中的T -- 進行泛型類型的實例化。

CLR為所有類型參數為“引用類型”的泛型類型產生同一份代碼,但如果類型參數為“值類型”,對每一個不同的“值類型”,CLR將為其產生一份獨立的代碼。

C#泛型的幾個特點

如果實例化泛型類型的參數相同,那么JIT編譯器會重復使用該類型,因此C#的動態泛型能力避免了C++靜態模板可能導致的代碼膨脹的問題。

C#泛型類型攜帶有豐富的元數據,因此C#的泛型類型可以應用于強大的反射技術。

C#的泛型采用“基類、接口、構造器、值類型/引用類型”的約束方式來實現對類型參數的“顯示約束”,提高了類型安全的同時,也喪失了C++模板基于“簽名”的隱式約束所具有的高靈活性。

C#泛型類在編譯時,先生成中間代碼IL,通用類型T只是一個占位符。在實例化類時,根據用戶指定的數據類型代替T并由即時編譯器(JIT)生成本地代碼,這個本地代碼中已經使用了實際的數據類型,等同于用實際類型寫的類,所以不同的封閉類的本地代碼是不一樣的。按照這個原理,我們可以這樣認為:泛型類的不同的封閉類是分別不同的數據類型。

這樣泛型不僅更加靈活,也同時將代碼的簡便和提高到一個層次!不用再為具體不同的重載方法寫具體的代碼了!

C# 泛型是開發工具庫中的一個無價之寶。它們可以提高性能、類型安全和質量,減少重復性的編程任務,簡化總體編程模型,而這一切都是通過優雅的、可讀性強的語法完成的。盡管 C# 泛型的根基是 C++ 模板,但 C# 通過提供編譯時安全和支持將泛型提高到了一個新水平。C# 利用了兩階段編譯、元數據以及諸如約束和一般方法之類的創新性的概念。毫無疑問,C# 的將來版本將繼續發展泛型,以便添加新的功能,并且將泛型擴展到諸如數據訪問或本地化之類的其他 .NET Framework 領域。

當然,C#的泛型還很多應用,現在我還只是了解了它的機制和原理,在接下來的學習中我會系統得學習泛型所支持的抽象泛型,接口泛型,結構和委托等!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲电影在线看| 中文字幕日韩欧美| 亚洲aa中文字幕| 精品久久中文字幕| 欧美日韩久久久久| 国产成人综合一区二区三区| 亚洲国产高清福利视频| 欧美激情综合色| 姬川优奈aav一区二区| 91国内揄拍国内精品对白| 欧美电影在线免费观看网站| 久久久久亚洲精品| 国外成人免费在线播放| 欧洲成人在线视频| 日韩成人性视频| 国产精品久久久久久久久久东京| 国产精品综合网站| 久久久噜噜噜久久久| 久久久久国产精品www| 国产欧美精品日韩精品| 欧美福利视频在线观看| 国产一区玩具在线观看| 91国偷自产一区二区三区的观看方式| 欧美高清在线观看| 久久视频在线播放| 日韩在线一区二区三区免费视频| 日韩精品高清在线| 国产成人久久久精品一区| 亚洲综合社区网| 欧美色xxxx| 欧美激情第一页xxx| 国产精品亚洲精品| 日韩精品一区二区视频| 韩国精品美女www爽爽爽视频| 亚洲自拍偷拍在线| 亚洲综合av影视| 国产精品入口夜色视频大尺度| 日韩精品欧美国产精品忘忧草| 精品国产91久久久| 国产日韩专区在线| 欧美日韩国产限制| 国产91成人video| 91九色综合久久| 亚洲自拍在线观看| 久久精品男人天堂| 欧美丝袜第一区| 狠狠躁18三区二区一区| 成人免费午夜电影| 欧美自拍视频在线| 久热精品视频在线| 精品国产1区2区| 久久91精品国产| 亚洲欧美在线免费观看| 亚洲精品综合久久中文字幕| 欧美xxxx做受欧美.88| 国产丝袜一区二区三区| 欧美色另类天堂2015| 国产成人精品免高潮费视频| 国产精品香蕉在线观看| 欧美激情第1页| 欧洲亚洲女同hd| 中文字幕久久久av一区| 日本一本a高清免费不卡| 日本一区二区三区四区视频| 欧美激情一级欧美精品| 国产一区深夜福利| 欧美中文字幕在线| 国产精品白丝jk喷水视频一区| 国产日韩精品入口| 国产精品网红福利| 国产亚洲精品久久久| 国产精品日日摸夜夜添夜夜av| 亲爱的老师9免费观看全集电视剧| 国产情人节一区| 色777狠狠综合秋免鲁丝| 国产成人精品久久二区二区| 国产美女91呻吟求| 91成人在线视频| 91精品国产综合久久香蕉922| 成人免费大片黄在线播放| 丝袜亚洲欧美日韩综合| 91日韩在线视频| 欧美专区在线视频| 91精品综合视频| 欧美日韩国产一区中文午夜| 高清欧美性猛交| 国产午夜精品久久久| 久久资源免费视频| 欧美刺激性大交免费视频| 亚洲精品久久久久久久久久久久| 一区二区日韩精品| 欧美激情中文字幕乱码免费| 亚洲国产精品小视频| 久久久久久久久久久免费| 精品国产一区久久久| 日韩精品一区二区视频| 日韩精品免费视频| 国产精品爽爽爽爽爽爽在线观看| 久久香蕉国产线看观看网| 欧美日韩激情视频8区| 日韩av在线直播| 青青草精品毛片| 国产日产欧美精品| 久久亚洲一区二区三区四区五区高| 欧美高清视频在线| 色多多国产成人永久免费网站| 亚洲缚视频在线观看| 欧美成人国产va精品日本一级| 5252色成人免费视频| 欧美日韩色婷婷| 亚洲精品www久久久| 操日韩av在线电影| 亚洲精品一区二三区不卡| 精品久久香蕉国产线看观看gif| 国产a∨精品一区二区三区不卡| 亚洲精品国产美女| 国外日韩电影在线观看| 精品视频在线播放| 久久香蕉国产线看观看网| 国产欧美精品久久久| 欧美最顶级丰满的aⅴ艳星| 亚洲美女av黄| 高清视频欧美一级| 色婷婷综合成人| 国内精品视频在线| 亚洲欧美综合区自拍另类| 综合国产在线观看| 亚洲精品久久7777777| 欧洲美女免费图片一区| 欧美成人免费视频| 亚洲开心激情网| 色www亚洲国产张柏芝| 一区二区欧美亚洲| 久久深夜福利免费观看| 91色中文字幕| 日韩av电影在线免费播放| 日韩欧美精品网站| 久久天堂电影网| 欧美成人精品影院| 国产精品电影网站| 欧美激情va永久在线播放| 欧美激情按摩在线| 午夜欧美不卡精品aaaaa| 精品福利樱桃av导航| 日韩一区二区福利| 亚洲激情视频网| 亚洲电影免费观看高清| 欧美精品情趣视频| 青青久久av北条麻妃黑人| 日韩欧美一区视频| 亚洲免费成人av电影| 日本一区二区三区在线播放| 国产97在线|日韩| 成人精品一区二区三区电影黑人| 欧美性猛交xxxx乱大交| 亚州精品天堂中文字幕| 2020欧美日韩在线视频| 国产亚洲精品高潮| 欧美午夜美女看片| 久久久久久av| 欧美激情二区三区| 亚洲无限乱码一二三四麻| 精品自在线视频| 亚洲国产第一页|