標籤:style c class blog code java
泛型把類或方法的類型的確定延遲到執行個體化該類或方法的時候 ,也就是說剛開始聲明是不指定類型,等到要使用(執行個體化)時再指定類型
泛型可以用於 類、方法、委託、事件等
下面先寫一個簡單的泛型
public class GenericClass<T>{ void SomeMethod( T t ) { //do something }}
其使用方法如下:
執行個體化一個類
?
| 1 |
GenericClass<int> gci=new GenericClass<int>(); |
方法SomeMethod就具有整數類型的參數了
下面寫一個例子
using System;using System.Collections.Generic;using System.Text;namespace example{ class GenericClass<T> { public void PrintType(T t) { Console.WriteLine("Value:{0} Type:{1}",t,t.GetType()); } } class Program { static void Main(string[] args) { int i = 0; GenericClass<int> gci = new GenericClass<int>(); gci.PrintType(i); string s = "hello"; GenericClass<string> gcs = new GenericClass<string>(); gcs.PrintType(s); Console.ReadLine(); } }}
泛型方法可以出現在泛型或非泛型型別上。需要注意的是,並不是只要方法屬於泛型型別,或者甚至是方法的形參的類型是封閉類型的泛型參數,就可以說方法是泛型方法。只有當方法具有它自己的型別參數列表時,才能稱其為泛型方法。在下面的代碼中,只有方法 G 是泛型方法。
?
| 1 2 3 4 5 6 7 8 |
class A { T G<T>(T arg) {...} } class Generic<T> { T M(T arg) {...} } |
泛型的Where
泛型的Where能夠對型別參數作出限定。有以下幾種方式。
·where T : struct 限制型別參數T必須繼承自System.ValueType。
·where T : class 限制型別參數T必須是參考型別,也就是不能繼承自System.ValueType。
·where T : new() 限制型別參數T必須有一個預設的建構函式
·where T : NameOfClass 限制型別參數T必須繼承自某個類或實現某個介面。
以上這些限定可以組合使用,比如: public class Point where T : class, IComparable, new()
例如:
class Person<T> where T:class { } class Program { static void Main(string[] args) { Person<int> bb = new Person<int>(); //報錯,錯誤 1 類型“int”必須是參考型別才能用作泛型型別或方法“ConsoleApplication1.Person<T>”中的參數“T” } }