深入浅出.NET泛型编程(1)
生活随笔
收集整理的這篇文章主要介紹了
深入浅出.NET泛型编程(1)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
深入淺出.NET泛型編程(1) 使用泛型集合
.NET 2.0的System.Collections.Generics 命名空間包含了泛型集合定義。各種不同的集合/容器類都被"參數化"了。為使用它們,只需簡單地指定參數化的類型即可。請看例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中,我編寫了一個泛型的列表的例子,在尖括號內指定參數類型為int。該代碼的執行將產生結果"Total is 7"。現在,如果我去掉語句doubleList.Add(5.0)的注釋,我將得到一個編譯錯誤。編譯器指出它不能發送值5.0到方法Add(),因為該方法僅接受int型。不同于例1,這里的代碼實現了類型安全。
5. CLR對于泛型的支持
泛型不僅是一個語言級上的特征。.NET CLR能識別出泛型。在這種意義上說,泛型的使用是.NET中最為優秀的特征之一。對每個用于泛型化的類型的參數,類也同樣沒有脫離開微軟中間語言(MSIL)。換句話說,你的配件集僅包含你的參數化的數據結構或類的一個定義,而不管使用多少種不同的類型來表達該參數化的類型。例如,如果你定義一個泛型類型MyList<T>,僅僅該類型的一個定義出現在MSIL中。當程序執行時,不同的類被動態地創建,每個類對應該參數化類型的一種類型。如果你使用MyList<int>和MyList<double>,有兩種類即被創建。當你的程序執行時,讓我們進一步在例3中分析這一點。
例3.創建一個泛型類
//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();
}
}
}
該例中,我創建了一個稱為MyList泛型類。為把它參數化,我簡單地插入了一個尖括號。在<>內的T代表了實際的當使用該類時要指定的類型。在MyList類中,定義了一個靜態字段objCount。我在構造器中增加它的值。因此我能發現使用我的類的用戶共創建了多少個那種類型的對象。屬性Count返回與被調用的實例同類型的實例的數目。
在Main()方法,我創建了MyList<int>的兩個實例,一個MyList<double>的實例,還有兩個MyList<SampleClass>的實例--其中SampleClass是我已定義了的類。問題是:Count(上面的程序的輸出)的值該是多少?在你繼閱讀之前,試一試回答這個問題。
解決了上面的問題?你得到下列的答案了嗎?
12
22
31
41
52???
6/**//*注意:這里是2。因為這個是運行時動態創建的,在編譯時,static的變量值為1,如同第一,第二行,他們都是2,因為在編譯時就已經創建兩個int類型的實例,所以static的值是2*/
前面兩個2對應MyList<int>,第一個1對應MyList<double>,第二個1對應MyList<SampleClass>--在此,僅創建一個這種類型的實例。最后一個2對應MyList<SampleClass>,因為代碼中又創建了這種類型的另外一個實例。上面的例子說明MyList<int>是一個與MyList<double>不同的類,而MyList<double>又是一個與MyList<SampleClass>不同的類。因此,在這個例中,我們有四個類:MyList: MyList<T>,MyList<int>,MyList<double>和MyList<X>。注意,雖然有4個MyList類,但僅有一個被存儲在MSIL。怎么能證明這一點?請看圖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()方法就是一個泛型方法,它與參數化的類型T一起工作。當在Main()中激活Copy()時,編譯器根據提供給Copy()方法的參數確定出要使用的具體類型。
posted on 2005-08-19 23:24 海盜 閱讀(...) 評論(...) 編輯 收藏
.NET 2.0的System.Collections.Generics 命名空間包含了泛型集合定義。各種不同的集合/容器類都被"參數化"了。為使用它們,只需簡單地指定參數化的類型即可。請看例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中,我編寫了一個泛型的列表的例子,在尖括號內指定參數類型為int。該代碼的執行將產生結果"Total is 7"。現在,如果我去掉語句doubleList.Add(5.0)的注釋,我將得到一個編譯錯誤。編譯器指出它不能發送值5.0到方法Add(),因為該方法僅接受int型。不同于例1,這里的代碼實現了類型安全。
5. CLR對于泛型的支持
泛型不僅是一個語言級上的特征。.NET CLR能識別出泛型。在這種意義上說,泛型的使用是.NET中最為優秀的特征之一。對每個用于泛型化的類型的參數,類也同樣沒有脫離開微軟中間語言(MSIL)。換句話說,你的配件集僅包含你的參數化的數據結構或類的一個定義,而不管使用多少種不同的類型來表達該參數化的類型。例如,如果你定義一個泛型類型MyList<T>,僅僅該類型的一個定義出現在MSIL中。當程序執行時,不同的類被動態地創建,每個類對應該參數化類型的一種類型。如果你使用MyList<int>和MyList<double>,有兩種類即被創建。當你的程序執行時,讓我們進一步在例3中分析這一點。
例3.創建一個泛型類
//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();
}
}
}
該例中,我創建了一個稱為MyList泛型類。為把它參數化,我簡單地插入了一個尖括號。在<>內的T代表了實際的當使用該類時要指定的類型。在MyList類中,定義了一個靜態字段objCount。我在構造器中增加它的值。因此我能發現使用我的類的用戶共創建了多少個那種類型的對象。屬性Count返回與被調用的實例同類型的實例的數目。
在Main()方法,我創建了MyList<int>的兩個實例,一個MyList<double>的實例,還有兩個MyList<SampleClass>的實例--其中SampleClass是我已定義了的類。問題是:Count(上面的程序的輸出)的值該是多少?在你繼閱讀之前,試一試回答這個問題。
解決了上面的問題?你得到下列的答案了嗎?
12
22
31
41
52???
6/**//*注意:這里是2。因為這個是運行時動態創建的,在編譯時,static的變量值為1,如同第一,第二行,他們都是2,因為在編譯時就已經創建兩個int類型的實例,所以static的值是2*/
前面兩個2對應MyList<int>,第一個1對應MyList<double>,第二個1對應MyList<SampleClass>--在此,僅創建一個這種類型的實例。最后一個2對應MyList<SampleClass>,因為代碼中又創建了這種類型的另外一個實例。上面的例子說明MyList<int>是一個與MyList<double>不同的類,而MyList<double>又是一個與MyList<SampleClass>不同的類。因此,在這個例中,我們有四個類:MyList: MyList<T>,MyList<int>,MyList<double>和MyList<X>。注意,雖然有4個MyList類,但僅有一個被存儲在MSIL。怎么能證明這一點?請看圖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()方法就是一個泛型方法,它與參數化的類型T一起工作。當在Main()中激活Copy()時,編譯器根據提供給Copy()方法的參數確定出要使用的具體類型。
posted on 2005-08-19 23:24 海盜 閱讀(...) 評論(...) 編輯 收藏
轉載于:https://www.cnblogs.com/Grisson/archive/2005/08/19/218844.html
總結
以上是生活随笔為你收集整理的深入浅出.NET泛型编程(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GitHub客户端 Desktop使用
- 下一篇: 02-15 GUCCI 我喜欢的