C#泛型編程是.NET framework 2.0的新特征,它提高了代碼安全性和代碼重用的問題。由於泛型必須指定類型,正確的使用可以避免了裝箱拆箱的問題;使用了泛型後,可以將演算法或組件泛型化,基於類型參數支持任意數據類型,從而提高了代碼的重用性。 C#泛型編程在C#是很重要的特性,建議.NET開發熟 ...
C#泛型編程是.NET framework 2.0的新特征,它提高了代碼安全性和代碼重用的問題。由於泛型必須指定類型,正確的使用可以避免了裝箱拆箱的問題;使用了泛型後,可以將演算法或組件泛型化,基於類型參數支持任意數據類型,從而提高了代碼的重用性。 C#泛型編程在C#是很重要的特性,建議.NET開發熟練掌握它的基本知識點,本文將介紹它的幾個知識點,供大家參考。
1. 泛型類型和方法
泛型類型和方法允許在定義時不指定具體的類型,而是在使用時確定類型。泛型類型和方法可以增加代碼的靈活性和可重用性。這是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. 泛型約束
泛型約束允許限制泛型參數的類型,以增加類型安全性和代碼約束。可以使用關鍵字`where`在泛型方法或泛型類型上應用約束。大家可以參考前面的文章深入理解C#泛型:new與where關鍵字全解析
示例代碼:
public void Process<T>(T item) where T : IComparable<T>
{
// 使用IComparable<T>介面進行比較
}
// 以上代碼泛型參數 T 受到了 IComparable<T> 泛型約束。
//這個約束指定了傳入的類型 T 必須實現 IComparable<T> 介面,
//以便在方法內部進行比較操作
3. 泛型介面和委托
泛型介面和委托允許在定義介面和委托時使用泛型類型參數,使其更通用和靈活。
示例代碼:
// 泛型介面示例
public interface IRepository<T>
{
void Add(T item);
}
// 泛型委托示例
public delegate void MyGenericDelegate<T>(T item);
4. 泛型類的繼承和介面實現
泛型類可以繼承其他泛型類或非泛型類,也可以實現泛型或非泛型介面。可以在派生類或實現類中指定具體的類型參數。
示例代碼:
public class MyGenericList<T> : List<T>
{
// 實現泛型類List<T>
}
public class MyRepository<T> : IRepository<T>
{
public void Add(T item)
{
// 實現IRepository<T>介面
}
}
//以上是常用的各種helper類示例,熟悉吧!
5. 泛型集合類
C#還提供了許多內置的泛型集合類來提升開發效率,例如List
示例代碼:
List<string> names = new List<string>();
names.Add("張山");
names.Add("李四");
Dictionary<int, string> example= new Dictionary<int, string>();
example.Add(1, "歡迎加入公眾號");
example.Add(2, "dotnet開發跳槽");
6. 泛型委托和事件
泛型委托和事件允許定義具有泛型參數的委托類型和事件處理器。可以在使用時指定具體的類型參數。多用於訂閱事件。
示例代碼:
// 定義一個泛型委托 MyGenericDelegate<T>,表示可以接受類型為 T 的參數的委托
public delegate void MyGenericDelegate<T>(T item);
// 定義一個泛型類 EventPublisher<T>,用於發佈泛型事件
public class EventPublisher<T>
{
// 聲明一個泛型事件 MyEvent,事件處理器類型為 MyGenericDelegate<T>
public event MyGenericDelegate<T> MyEvent;
// 觸發事件的方法,將傳入的參數 item 傳遞給事件處理器
public void RaiseEvent(T item)
{
// 使用空值條件運算符 ?. 檢查事件是否有訂閱者,如果有,則調用委托的 Invoke 方法
MyEvent?.Invoke(item);
}
}
//調用
public static void Main()
{
// 創建事件處理器方法
void MyEventHandler(int item)
{
Console.WriteLine($"Event handled: {item}");
}
// 實例化 EventPublisher<int> 類並訂閱事件
EventPublisher<int> publisher = new EventPublisher<int>();
publisher.MyEvent += MyEventHandler;
// 調用 RaiseEvent 方法來觸發事件
int eventData = 42;
publisher.RaiseEvent(eventData);
}
7. 泛型約束和介面協變/逆變
C# 4.0引入了介面的協變和逆變,使得泛型類型參數可以在介面中進行協變(`out`)或逆變(`in`)。這主要解決之前泛型介面調用子類父類類型不同而出現的問題。協變允許將派生類型轉換為基類型,逆變允許將基類型轉換為派生類型。大家可以看這篇文章C#泛型的逆變協變之個人理解。
//協變
public interface IAnimal<out T>
{
T Get();
}
//逆變
public interface ICage<in T>
{
void Add(T animal);
}
8. 泛型預設值
泛型類型的預設值可以使用`default(T)`獲取,無需瞭解具體的類型。 預設值對於泛型方法或類中可能為null的引用類型或可空值類型非常有用。
public void Process<T>(T item)
{
T defaultValue = default(T);
if (item.Equals(defaultValue))
{
// 處理預設值情況
}
}
結語
本文講述了C#泛型編程的知識點及關鍵概念和用法。它們可以提高代碼的可重用性、類型安全性和性能等。希望本文對你有所收穫,你還知道C#泛型的哪些知識點?歡迎留言討論和吐槽。
參考:微軟.NET官方文檔
來源公眾號:DotNet開發跳槽