C#泛型編程是.NET framework 2.0的新特征,它提高了代碼安全性和代碼重用的問題。由于泛型必須指定類型,正確的使用可以避免了裝箱拆箱的問題;使用了泛型后,可以將算法或組件泛型化,基于類型參數(shù)支持任意數(shù)據(jù)類型,從而提高了代碼的重用性。 C#泛型編程在C#是很重要的特性,建議.NET開發(fā)熟練掌握它的基本知識(shí)點(diǎn),本文將介紹它的幾個(gè)知識(shí)點(diǎn),供大家參考。
1. 泛型類型和方法
泛型類型和方法允許在定義時(shí)不指定具體的類型,而是在使用時(shí)確定類型。泛型類型和方法可以增加代碼的靈活性和可重用性。這是C#泛型最基本的功能。
示例代碼:
?public?T?GetMax<T>(T?a,?T?b)?where?T?:?IComparable<T>
?{
return a.CompareTo(b) > 0 ? a : b;
??}
??//?泛型類型方法示例
public class MyGenericList<T>
{
?????private?List<T>?items?=?new?List<T>();
?????public?void?Add(T?item){
items.Add(item);
}
}
2. 泛型約束
泛型約束允許限制泛型參數(shù)的類型,以增加類型安全性和代碼約束??梢允褂藐P(guān)鍵字`where`在泛型方法或泛型類型上應(yīng)用約束。大家可以參考前面的文章深入理解C#泛型:new與where關(guān)鍵字全解析
示例代碼:
public void Process<T>(T item) where T : IComparable<T>
{
// 使用IComparable<T>接口進(jìn)行比較
}
????//?以上代碼泛型參數(shù) T 受到了 IComparable<T>?泛型約束。
????//這個(gè)約束指定了傳入的類型 T 必須實(shí)現(xiàn) IComparable<T>?接口,
????//以便在方法內(nèi)部進(jìn)行比較操作
3. 泛型接口和委托
泛型接口和委托允許在定義接口和委托時(shí)使用泛型類型參數(shù),使其更通用和靈活。
示例代碼:
// 泛型接口示例
public?interface?IRepository<T>
{
????void?Add(T?item);
}
// 泛型委托示例
?public?delegate?void?MyGenericDelegate<T>(T?item);
4. 泛型類的繼承和接口實(shí)現(xiàn)
泛型類可以繼承其他泛型類或非泛型類,也可以實(shí)現(xiàn)泛型或非泛型接口。可以在派生類或?qū)崿F(xiàn)類中指定具體的類型參數(shù)。
示例代碼:
public class MyGenericList<T> : List<T>
{
// 實(shí)現(xiàn)泛型類List<T>
?????}
public class MyRepository<T> : IRepository<T>
{
public void Add(T item)
{
// 實(shí)現(xiàn)IRepository<T>接口
}
}
?????//以上是常用的各種helper類示例,熟悉吧!
5. 泛型集合類
C#還提供了許多內(nèi)置的泛型集合類來提升開發(fā)效率,例如List
示例代碼:
List<string> names = new List<string>();
names.Add("張山");
names.Add("李四");
???
?????Dictionary<int,?string>?example=?new?Dictionary<int,?string>();
?????example.Add(1,?"歡迎加入公眾號(hào)");
?????example.Add(2,?"dotnet開發(fā)跳槽");
6. 泛型委托和事件
泛型委托和事件允許定義具有泛型參數(shù)的委托類型和事件處理器??梢栽谑褂脮r(shí)指定具體的類型參數(shù)。多用于訂閱事件。
示例代碼:
// 定義一個(gè)泛型委托 MyGenericDelegate<T>,表示可以接受類型為 T 的參數(shù)的委托
public delegate void MyGenericDelegate<T>(T item);
// 定義一個(gè)泛型類 EventPublisher<T>,用于發(fā)布泛型事件
public class EventPublisher<T>
{
// 聲明一個(gè)泛型事件 MyEvent,事件處理器類型為 MyGenericDelegate<T>
public event MyGenericDelegate<T> MyEvent;
// 觸發(fā)事件的方法,將傳入的參數(shù) item 傳遞給事件處理器
public void RaiseEvent(T item)
{
// 使用空值條件運(yùn)算符 ?. 檢查事件是否有訂閱者,如果有,則調(diào)用委托的 Invoke 方法
MyEvent?.Invoke(item);
}
}
????
//調(diào)用?
public static void Main()
{
// 創(chuàng)建事件處理器方法
void MyEventHandler(int item)
????? {
Console.WriteLine($"Event handled: {item}");
}
// 實(shí)例化 EventPublisher<int> 類并訂閱事件
EventPublisher<int> publisher = new EventPublisher<int>();
publisher.MyEvent += MyEventHandler;
// 調(diào)用 RaiseEvent 方法來觸發(fā)事件
int eventData = 42;
publisher.RaiseEvent(eventData);
?}
7. 泛型約束和接口協(xié)變/逆變
C# 4.0引入了接口的協(xié)變和逆變,使得泛型類型參數(shù)可以在接口中進(jìn)行協(xié)變(`out`)或逆變(`in`)。這主要解決之前泛型接口調(diào)用子類父類類型不同而出現(xiàn)的問題。協(xié)變?cè)试S將派生類型轉(zhuǎn)換為基類型,逆變?cè)试S將基類型轉(zhuǎn)換為派生類型。大家可以看這篇文章C#泛型的逆變協(xié)變之個(gè)人理解。
//協(xié)變
public interface IAnimal<out T>
{
?????T?Get();
}
?//逆變???
public interface ICage<in T>
{
void Add(T animal);
}
8. 泛型默認(rèn)值
泛型類型的默認(rèn)值可以使用`default(T)`獲取,無需了解具體的類型。 默認(rèn)值對(duì)于泛型方法或類中可能為null的引用類型或可空值類型非常有用。
public void Process<T>(T item)
{
T defaultValue = default(T);
if (item.Equals(defaultValue))
{
// 處理默認(rèn)值情況
}
}
結(jié)語
本文講述了C#泛型編程的知識(shí)點(diǎn)及關(guān)鍵概念和用法。它們可以提高代碼的可重用性、類型安全性和性能等。希望本文對(duì)你有所收獲,你還知道C#泛型的哪些知識(shí)點(diǎn)?歡迎留言討論和吐槽。文章來源:http://www.zghlxwxcb.cn/news/detail-617667.html
參考:微軟.NET官方文檔文章來源地址http://www.zghlxwxcb.cn/news/detail-617667.html
來源公眾號(hào):DotNet開發(fā)跳槽
到了這里,關(guān)于每個(gè).NET開發(fā)都應(yīng)掌握C#泛型的知識(shí)點(diǎn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!