深入浅出.NET泛型编程(1)
生活随笔
收集整理的這篇文章主要介紹了
深入浅出.NET泛型编程(1)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
深入淺出.NET泛型編程(1) 使用泛型集合
.NET 2.0的System.Collections.Generics 命名空間包含了泛型集合定義。各種不同的集合/容器類都被"參數(shù)化"了。為使用它們,只需簡單地指定參數(shù)化的類型即可。請看例2:
例2.類型安全的泛型列表
List<int>?aList?=?new?List<int>();
aList.Add(3);
aList.Add(4);
//?aList.Add(5.0);
int?total?=?0;
foreach(int?val?in?aList)
{
total?=?total?+?val;
}
Console.WriteLine("Total?is?{0}",?total);?
在例2中,我編寫了一個泛型的列表的例子,在尖括號內(nèi)指定參數(shù)類型為int。該代碼的執(zhí)行將產(chǎn)生結(jié)果"Total is 7"。現(xiàn)在,如果我去掉語句doubleList.Add(5.0)的注釋,我將得到一個編譯錯誤。編譯器指出它不能發(fā)送值5.0到方法Add(),因?yàn)樵摲椒▋H接受int型。不同于例1,這里的代碼實(shí)現(xiàn)了類型安全。
5. CLR對于泛型的支持
泛型不僅是一個語言級上的特征。.NET CLR能識別出泛型。在這種意義上說,泛型的使用是.NET中最為優(yōu)秀的特征之一。對每個用于泛型化的類型的參數(shù),類也同樣沒有脫離開微軟中間語言(MSIL)。換句話說,你的配件集僅包含你的參數(shù)化的數(shù)據(jù)結(jié)構(gòu)或類的一個定義,而不管使用多少種不同的類型來表達(dá)該參數(shù)化的類型。例如,如果你定義一個泛型類型MyList<T>,僅僅該類型的一個定義出現(xiàn)在MSIL中。當(dāng)程序執(zhí)行時,不同的類被動態(tài)地創(chuàng)建,每個類對應(yīng)該參數(shù)化類型的一種類型。如果你使用MyList<int>和MyList<double>,有兩種類即被創(chuàng)建。當(dāng)你的程序執(zhí)行時,讓我們進(jìn)一步在例3中分析這一點(diǎn)。
例3.創(chuàng)建一個泛型類
//MyList.cs
Using?directives#region?Using?directives
using?System;
using?System.Collections.Generic;
using?System.Text;
#endregion
namespace?CLRSupportExample
{
public?class?MyList<T>
{
private?static?int?objCount?=?0;
public?MyList()
{objCount++;?}
public?int?Count
{
get
{return?objCount;?}
}
}
}
//Program.cs
Using?directives#region?Using?directives
using?System;
using?System.Collections.Generic;
using?System.Text;
#endregion
namespace?CLRSupportExample
{
class?SampleClass?{}
class?Program
{
static?void?Main(string[]?args)
{
MyList<int>?myIntList?=?new?MyList<int>();
MyList<int>?myIntList2?=?new?MyList<int>();
MyList<double>?myDoubleList?=?new?MyList<double>();
MyList<SampleClass>?mySampleList?=?new?MyList<SampleClass>();
Console.WriteLine(myIntList.Count);
Console.WriteLine(myIntList2.Count);
Console.WriteLine(myDoubleList.Count);
Console.WriteLine(mySampleList.Count);
Console.WriteLine(new?MyList<sampleclass>().Count);
Console.ReadLine();
}
}
}
該例中,我創(chuàng)建了一個稱為MyList泛型類。為把它參數(shù)化,我簡單地插入了一個尖括號。在<>內(nèi)的T代表了實(shí)際的當(dāng)使用該類時要指定的類型。在MyList類中,定義了一個靜態(tài)字段objCount。我在構(gòu)造器中增加它的值。因此我能發(fā)現(xiàn)使用我的類的用戶共創(chuàng)建了多少個那種類型的對象。屬性Count返回與被調(diào)用的實(shí)例同類型的實(shí)例的數(shù)目。
在Main()方法,我創(chuàng)建了MyList<int>的兩個實(shí)例,一個MyList<double>的實(shí)例,還有兩個MyList<SampleClass>的實(shí)例--其中SampleClass是我已定義了的類。問題是:Count(上面的程序的輸出)的值該是多少?在你繼閱讀之前,試一試回答這個問題。
解決了上面的問題?你得到下列的答案了嗎?
12
22
31
41
52???
6/**//*注意:這里是2。因?yàn)檫@個是運(yùn)行時動態(tài)創(chuàng)建的,在編譯時,static的變量值為1,如同第一,第二行,他們都是2,因?yàn)樵诰幾g時就已經(jīng)創(chuàng)建兩個int類型的實(shí)例,所以static的值是2*/
前面兩個2對應(yīng)MyList<int>,第一個1對應(yīng)MyList<double>,第二個1對應(yīng)MyList<SampleClass>--在此,僅創(chuàng)建一個這種類型的實(shí)例。最后一個2對應(yīng)MyList<SampleClass>,因?yàn)榇a中又創(chuàng)建了這種類型的另外一個實(shí)例。上面的例子說明MyList<int>是一個與MyList<double>不同的類,而MyList<double>又是一個與MyList<SampleClass>不同的類。因此,在這個例中,我們有四個類:MyList: MyList<T>,MyList<int>,MyList<double>和MyList<X>。注意,雖然有4個MyList類,但僅有一個被存儲在MSIL。怎么能證明這一點(diǎn)?請看圖1顯示出的使用工具ildasm.exe生成的MSIL代碼。
6. 泛型方法
除了有泛型類,你也可以有泛型方法。泛型方法可以是任何類的一部分。讓我們看一下例4:
例4.一個泛型方法
public?class?Program
{
public?static?void?Copy<T>(List<T>?source,?List<T>?destination)
{
foreach?(T?obj?in?source)
{
destination.Add(obj);
}
}
static?void?Main(string[]?args)
{
List<int>?lst1?=?new?List<int>();
lst1.Add(2);
lst1.Add(4);
List<int>?lst2?=?new?List<int>();
Copy(lst1,?lst2);
Console.WriteLine(lst2.Count);
}
}
Copy()方法就是一個泛型方法,它與參數(shù)化的類型T一起工作。當(dāng)在Main()中激活Copy()時,編譯器根據(jù)提供給Copy()方法的參數(shù)確定出要使用的具體類型。
posted on 2005-08-19 23:24 海盜 閱讀(...) 評論(...) 編輯 收藏
.NET 2.0的System.Collections.Generics 命名空間包含了泛型集合定義。各種不同的集合/容器類都被"參數(shù)化"了。為使用它們,只需簡單地指定參數(shù)化的類型即可。請看例2:
例2.類型安全的泛型列表
List<int>?aList?=?new?List<int>();
aList.Add(3);
aList.Add(4);
//?aList.Add(5.0);
int?total?=?0;
foreach(int?val?in?aList)
{
total?=?total?+?val;
}
Console.WriteLine("Total?is?{0}",?total);?
在例2中,我編寫了一個泛型的列表的例子,在尖括號內(nèi)指定參數(shù)類型為int。該代碼的執(zhí)行將產(chǎn)生結(jié)果"Total is 7"。現(xiàn)在,如果我去掉語句doubleList.Add(5.0)的注釋,我將得到一個編譯錯誤。編譯器指出它不能發(fā)送值5.0到方法Add(),因?yàn)樵摲椒▋H接受int型。不同于例1,這里的代碼實(shí)現(xiàn)了類型安全。
5. CLR對于泛型的支持
泛型不僅是一個語言級上的特征。.NET CLR能識別出泛型。在這種意義上說,泛型的使用是.NET中最為優(yōu)秀的特征之一。對每個用于泛型化的類型的參數(shù),類也同樣沒有脫離開微軟中間語言(MSIL)。換句話說,你的配件集僅包含你的參數(shù)化的數(shù)據(jù)結(jié)構(gòu)或類的一個定義,而不管使用多少種不同的類型來表達(dá)該參數(shù)化的類型。例如,如果你定義一個泛型類型MyList<T>,僅僅該類型的一個定義出現(xiàn)在MSIL中。當(dāng)程序執(zhí)行時,不同的類被動態(tài)地創(chuàng)建,每個類對應(yīng)該參數(shù)化類型的一種類型。如果你使用MyList<int>和MyList<double>,有兩種類即被創(chuàng)建。當(dāng)你的程序執(zhí)行時,讓我們進(jìn)一步在例3中分析這一點(diǎn)。
例3.創(chuàng)建一個泛型類
//MyList.cs
Using?directives#region?Using?directives
using?System;
using?System.Collections.Generic;
using?System.Text;
#endregion
namespace?CLRSupportExample
{
public?class?MyList<T>
{
private?static?int?objCount?=?0;
public?MyList()
{objCount++;?}
public?int?Count
{
get
{return?objCount;?}
}
}
}
//Program.cs
Using?directives#region?Using?directives
using?System;
using?System.Collections.Generic;
using?System.Text;
#endregion
namespace?CLRSupportExample
{
class?SampleClass?{}
class?Program
{
static?void?Main(string[]?args)
{
MyList<int>?myIntList?=?new?MyList<int>();
MyList<int>?myIntList2?=?new?MyList<int>();
MyList<double>?myDoubleList?=?new?MyList<double>();
MyList<SampleClass>?mySampleList?=?new?MyList<SampleClass>();
Console.WriteLine(myIntList.Count);
Console.WriteLine(myIntList2.Count);
Console.WriteLine(myDoubleList.Count);
Console.WriteLine(mySampleList.Count);
Console.WriteLine(new?MyList<sampleclass>().Count);
Console.ReadLine();
}
}
}
該例中,我創(chuàng)建了一個稱為MyList泛型類。為把它參數(shù)化,我簡單地插入了一個尖括號。在<>內(nèi)的T代表了實(shí)際的當(dāng)使用該類時要指定的類型。在MyList類中,定義了一個靜態(tài)字段objCount。我在構(gòu)造器中增加它的值。因此我能發(fā)現(xiàn)使用我的類的用戶共創(chuàng)建了多少個那種類型的對象。屬性Count返回與被調(diào)用的實(shí)例同類型的實(shí)例的數(shù)目。
在Main()方法,我創(chuàng)建了MyList<int>的兩個實(shí)例,一個MyList<double>的實(shí)例,還有兩個MyList<SampleClass>的實(shí)例--其中SampleClass是我已定義了的類。問題是:Count(上面的程序的輸出)的值該是多少?在你繼閱讀之前,試一試回答這個問題。
解決了上面的問題?你得到下列的答案了嗎?
12
22
31
41
52???
6/**//*注意:這里是2。因?yàn)檫@個是運(yùn)行時動態(tài)創(chuàng)建的,在編譯時,static的變量值為1,如同第一,第二行,他們都是2,因?yàn)樵诰幾g時就已經(jīng)創(chuàng)建兩個int類型的實(shí)例,所以static的值是2*/
前面兩個2對應(yīng)MyList<int>,第一個1對應(yīng)MyList<double>,第二個1對應(yīng)MyList<SampleClass>--在此,僅創(chuàng)建一個這種類型的實(shí)例。最后一個2對應(yīng)MyList<SampleClass>,因?yàn)榇a中又創(chuàng)建了這種類型的另外一個實(shí)例。上面的例子說明MyList<int>是一個與MyList<double>不同的類,而MyList<double>又是一個與MyList<SampleClass>不同的類。因此,在這個例中,我們有四個類:MyList: MyList<T>,MyList<int>,MyList<double>和MyList<X>。注意,雖然有4個MyList類,但僅有一個被存儲在MSIL。怎么能證明這一點(diǎn)?請看圖1顯示出的使用工具ildasm.exe生成的MSIL代碼。
6. 泛型方法
除了有泛型類,你也可以有泛型方法。泛型方法可以是任何類的一部分。讓我們看一下例4:
例4.一個泛型方法
public?class?Program
{
public?static?void?Copy<T>(List<T>?source,?List<T>?destination)
{
foreach?(T?obj?in?source)
{
destination.Add(obj);
}
}
static?void?Main(string[]?args)
{
List<int>?lst1?=?new?List<int>();
lst1.Add(2);
lst1.Add(4);
List<int>?lst2?=?new?List<int>();
Copy(lst1,?lst2);
Console.WriteLine(lst2.Count);
}
}
Copy()方法就是一個泛型方法,它與參數(shù)化的類型T一起工作。當(dāng)在Main()中激活Copy()時,編譯器根據(jù)提供給Copy()方法的參數(shù)確定出要使用的具體類型。
posted on 2005-08-19 23:24 海盜 閱讀(...) 評論(...) 編輯 收藏
轉(zhuǎn)載于:https://www.cnblogs.com/Grisson/archive/2005/08/19/218844.html
總結(jié)
以上是生活随笔為你收集整理的深入浅出.NET泛型编程(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GitHub客户端 Desktop使用
- 下一篇: IXMLDOMDocument中的loa