【C#】-泛型

VisionCode發表於2024-08-14

泛型簡介:動態編碼概述

有沒有想過能夠安全處理任何型別資料的方法?這就是泛型方法的作用!看看 GetFirstItem 示例。

public T GetFirstItem<T>(List<T> list)
{
return list.FirstOrDefault();
}

在這個場景中,我們為方法設定了舞臺,使其能夠在不犧牲強型別提供的安全網的情況下動態適應各種資料型別。

泛型類:重新定義適應性 準備好被泛型類改變遊戲規則的能力所震撼。看看能夠輕鬆適應其內容資料型別的動態 Box。

public class Box<T>
{
public T Content { get; set; }
}

// 使用
Box<string> stringBox = new Box<string> { Content = "Hello, Generics!" };

透過泛型類,我們解鎖了建立可重用元件的能力,這些元件能夠無縫適應各種資料型別——純粹的編碼優雅之美。

泛型介面:打造多功能藍圖

進入泛型介面的領域,我們遇到了多功能的 IRepository 介面。

public interface IRepository<T>
{
void Add(T entity);
T GetById(int id);
}

// 實現
public class UserRepository : IRepository<User>
{
/* 實現方法 */
}

泛型介面使我們能夠建立藍圖,這些藍圖能夠無縫處理各種實體,為我們的編碼工作增添了一層優雅。

泛型約束:施加控制

約束提供了一種施加控制的方法。透過定義規則,我們確保泛型方法僅與符合特定條件的型別互動,為我們的程式碼增添了一層控制和可預測性。

new()約束:構建新例項的創意

看看強大的 new() 約束——一個創意的燈塔!它不僅允許我們建立型別的例項,還邀請我們探索無引數建構函式的未知領域。見證這一魔力。

public T CreateInstance<T>() where T : new()
{
return new T();
}

在這裡,new() 約束確保任何與此方法互動的型別必須具有無引數建構函式。這是一種微妙的觸感,為我們的泛型冒險增添了優雅。

基類約束:指導家族譜系

讓我們引入一個基於家族譜系指導泛型的約束。進入 where T: MyBaseClass 約束。

public void PerformAction<T>(T item) where T : MyBaseClass
{
// 您的程式碼在這裡,確保 T 派生自 MyBaseClass
}

現在,我們的泛型方法優雅地與派生自 MyBaseClass 的型別共舞,保持與其譜系的和諧聯絡。

介面約束:釋放共同行為

想象一下,我們的泛型方法希望有一個共享的語言,一個共同的基礎。看看 where T: ICommonInterface 約束。

public void InvokeCommonMethod<T>(T item) where T : ICommonInterface
{
// 您的程式碼在這裡,知道 T 遵循 ICommonInterface
}

使用這個約束,我們的泛型方法僅接受實現了 ICommonInterface 的型別。它確保一切都能很好地結合在一起並順利工作。

引用型別約束:防範空值問題

在追求安全的過程中,考慮 where T: class 約束。

public void GuardAgainstNull<T>(T item) where T : class
{
// 您的程式碼在這裡,避免 NullReferenceException
}

這個約束確保我們的泛型方法免受空值的影響,促進更可靠的程式碼。

協變和逆變:導航型別關係

我們的最終目的地是協變和逆變。介紹 IReadable 和 IWritable 介面。

public interface IReadable<out T>
{
T GetItem();
}

public interface IWritable<in T>
{
void SetItem(T item);
}

這些介面,具有協變和逆變功能,使我們能夠處理相關型別,增強了程式碼的適應性。

結語

C# 的泛型技術不僅增強了程式碼的靈活性和型別安全性,還顯著提升了執行效率。透過採用泛型,您的程式設計體驗將變得更加流暢和優雅,感受其帶來的神奇效果。

相關文章