C 中泛型類,泛型方法,泛型約束實際應用

2022-03-31 00:41:52 字數 2534 閱讀 1229

所謂泛型,即通過引數化型別來實現在同乙份**上操作多種資料型別。

泛型程式設計是一種程式設計正規化,它利用「引數化型別」將型別抽象化,從而實現更為靈活的復用。在定義泛型類時,在對客戶端**能夠在例項化類時,可以用型別引數的型別種類施加限制。在搭建底層框架時,是最常見的程式設計方式。

泛型類範例:

namespace order.system.dal.data}}

}return _instance;}}

}

泛型類的目的是為了約束泛型方法傳引數型別或返回值型別。

在c# 2.0中,方法可以定義特定於其執行範圍的泛型引數,如下所示:

public class myclass

//此方法也可不指定方法引數

public void mymethod()

}

即使包含類不適用泛型引數,你也可以定義方法特定的泛型引數,如下所示:

public class myclass

//此方法也可不指定方法引數

public void mymethod()

}

注意:屬性和索引器不能指定自己的泛型引數,它們只能使用所屬類中定義的泛型引數進行操作。

在呼叫泛型方法的時候,你可以提供要在呼叫場所使用的型別,如下所示:

//呼叫泛型方法

myclass myclass = new myclass();

myclass.mymethod(3);

泛型推理:

在呼叫泛型方法時,c#編譯器足夠聰明,基於傳入的引數型別來推斷出正確的型別,並且它允許完全省略型別規範,如下所示:

//泛型推理機制呼叫泛型方法

myclass myclass = new myclass();

myclass.mymethod(3);

注意:泛型方法無法只根據返回值的型別推斷出型別,**如下:

public genericmethoddemo()

public class myclass

}

泛型方法中泛型引數的約束,如下:

public class myclass

}

如果客戶端**嘗試使用某個約束所不允許的型別來例項化類,則會產生編譯時錯誤。這些限制稱為約束。約束是使用 where 上下文關鍵字指定的。

下表列出了五種型別的約束:

約束說明

t:struct

型別引數必須是值型別。可以指定除 nullable 以外的任何值型別。

t:class

型別引數必須是引用型別,包括任何類、介面、委託或陣列型別。

t:new()

型別引數必須具有無引數的公共建構函式。當與其他約束一起使用時,new() 約束必須最後指定。

t:《基類名》

型別引數必須是指定的基類或派生自指定的基類。

t:《介面名稱》

型別引數必須是指定的介面或實現指定的介面。可以指定多個介面約束。約束介面也可以是泛型的。

t:u為 t 提供的型別引數必須是為 u 提供的引數或派生自為 u 提供的引數。這稱為裸型別約束.

派生約束

1.常見的

public class myclass5 where t :icomparable

2.約束放在類的實際派生之後

public class b

public class myclass6 : b where t : icomparable

3.可以繼承乙個基類和多個介面,且基類在介面前面

public class b

public class myclass7 where t : b, icomparable, icloneable

建構函式約束

1.常見的

public class myclass8 where t : new()

2.可以將建構函式約束和派生約束組合起來,前提是建構函式約束出現在約束列表的最後

public class myclass8 where t : icomparable, new()

值約束

1.常見的

public class myclass9 where t : struct

2.與介面約束同時使用,在最前面(不能與基類約束,建構函式約束一起使用)

public class myclass11 where t : struct, icomparable

引用約束

常見的public class myclass10 where t : class

多個泛型引數

public class myclass12where t : icomparable where u : class

泛型 泛型類 泛型方法 泛型擦除

1 是什麼?一種允許我們在不確定引數型別時候使用的型別。例如我不知道a方法應該會傳string還是int,我就用個泛型先佔坑。2 為什麼要用泛型?泛型可以在編譯期自動確定具體型別,檢查型別是否匹配,可以提高 的重用率,減少冗餘編碼。3 泛型與object的區別?像上面說的我不知道方法a的引數型別,其...

Dart 中泛型 泛型方法 泛型類 泛型介面

泛型就是解決類 介面 方法的復用性以及對不特定資料的支援 void main 定義乙個泛型方法 t printdata t value running dart users zhoujian dartdemo demo.dart 2zhoujian done exited with code 0 i...

泛型 (2)泛型類 泛型方法 泛型介面

一 泛型類 定義person類 package cn.itcast.p2.bean public class person implements comparable public person string name,int age public int compareto person p ov...