C#泛型基礎
C#語言推出泛型已經有好多年了。泛型的推出可以說是一項創舉,可是實際上我們經常是怎樣使用泛型的呢。?。
之前也常用一些泛型的基本用法,語法也看過一段時間。但是畢竟還是有很多”高級“一些的用法沒怎么用過。最近做一個基于微軟MCS架構的項目時,很多都給封裝好了,包括常用的TextBox也被微軟那幫人給重寫了。由于大量的重寫,所以難免會有大量的泛型等等大量的運用??吹奖环庋b好的源碼,也難免不去梳理一下相關知識。這一節主要包括一下幾個部分:
1、泛型約束
2、new關鍵字.
3、default關鍵字的用法
以上是c#泛型最基本的幾個知識點.下面將說說這些概念的理解以、關鍵字。
1、泛型約束.
何謂泛型約束呢。?泛型約束是我們在定義泛型類時,在實際泛型類的使用過程中,對泛型類類型的一些約束。
泛型約束是通過泛型類定義來體現的。請看下面代碼中泛型約束的定義:
public class BaseClass
{
public BaseClass()
{
Console.WriteLine("Abstractor constructor method");
}
public void Method()
{
Console.WriteLine(" method in Base Class");
}
}
public class TestSubClass : BaseClass
{
//public override void Method()
//{
// Console.WriteLine("testSubClass method");
//}
}
public class Cat
{
public void CatEat()
{
Console.WriteLine("CatEat method");
}
}
public class SubClass<T> where T:BaseClass
{
public T instance;
public void subMethod()
{
Console.WriteLine("subClass");
}
}
其中 SubClass<T>就是一個自定義類,T為泛型類型,where T:BaseClass就是定義的泛型類的約束。意思就是說在使用SubClass<T>時候,我們必須用BaseClass或者BaseClass的子類來對SubClass<T>進行實例化。
使用如下:
SubClass<BaseClass> cast = new SubClass<BaseClass>();
cast.subMethod();
SubClass<TestSubClass> cast2 = new SubClass<TestSubClass>();
cast2.subMethod();
Console.WriteLine("aa");
Console.ReadLine();
輸出如下:

2、new關鍵字。
new關鍵字的作用是值對泛型類型的默認構造函數。類型定義如下:
public abstract class BaseClass
{
public BaseClass()
{
Console.WriteLine("Abstractor constructor method");
}
public virtual void Method()
{
Console.WriteLine("Method in Abastact class");
}
}
public class TestSubClass : BaseClass
{
public TestSubClass()
{
}
}
public class SubClass<T> where T:BaseClass,new ()
{
public T instance;
public void subMethod()
{
Console.WriteLine("subClass");
if (instance == null)
{
instance = new T();
instance.Method();
Console.WriteLine(instance.GetType().ToString());
}
}
}
.new () 的意思是說泛型類型T必須要有一個無參數構造函數。
輸出如下:

此時,需要注意的是在用TestSubClass替換泛型類型T實例化 SubClass<T>時候,可以在TestSubClass中不定義任何構造函數,但是若我們要定義帶參數的構造函數時,一定同時要有不帶參數構造函數。因為我們不定義構造函數時,.Net FrameWork會默認有一個無參數構造函數,但是如果我們定義了一個帶參數的,則它只有這個構造函數了,這是C#語法開遍就介紹過了。
另外:在使用new進行約束時,不能帶有帶參數的構造函數。
3、default關鍵字的使用。
首先給出MSDN給出的介紹:
在泛型類和泛型方法中產生的一個問題是,在預先未知以下情況時,如何將默認值分配給參數化類型 T:
-
T 是引用類型還是值類型。
-
如果 T 為值類型,則它是數值還是結構。
給定參數化類型 T 的一個變量 t,只有當 T 為引用類型時,語句 t = null 才有效;只有當 T 為數值類型而不是結構時,語句 t = 0 才能正常使用。解決方案是使用 default 關鍵字,此關鍵字對于引用類型會返回空,對于數值類型會返回零。對于結構,此關鍵字將返回初始化為零或空的每個結構成員,具體取決于這些結構是值類型還是引用類型。以下來自 GenericList<T> 類的示例顯示了如何使用 default 關鍵字。
首先看看它的用法:
public class TestGeneric<T>
{
public T GetValue()
{
T instance = default(T);
if (instance == null)
{
Console.WriteLine(" instance is null");
}
else
{
Console.WriteLine("value of instance is {0}",instance);
}
return instance;
}
}
}
TestGeneric<string> instance = new TestGeneric<string>();
instance.GetValue();
Console.ReadLine();

如果將泛型類型string換位int,則輸出如下:

那么如果我們用struct類型替換泛型類型會是什么情況呢。?
可以定義一個struct試試:
代碼如下:
public struct Point
{
public int X { get; set; }
public int Y { get; set; }
}
TestGeneric<Point> instance = new TestGeneric<Point>();
instance.GetValue();
Console.ReadLine();

struct是一種值類型的,所以它不會像string等引用類型使用default的時候會為null。
好了,就到這里,希望對初學泛型的朋友有一些幫助!
浙公網安備 33010602011771號