2026-05-23 深入理解 C# 中的泛型(Generics)練習題

2026-05-23 深入理解 C# 中的泛型(Generics)練習題

我:
接下來繼續 出題,
請一個階段一個階段來教我, 並問問題( 不要答案), 然後確定我是否理解, 之後再接下一個階段, 而且每個階段都要很短, 這樣我才能吸收並消化.
請繼續第八階段:深入理解 C# 中的泛型(Generics)
內容:
什麼是泛型,為什麼我們需要泛型。
如何使用泛型來創建靈活且可重用的類別和方法。
學習常見的泛型集合類別,如 List、Dictionary<TKey, TValue>。
練習:
創建一個泛型類來存儲不同類型的數據。
使用泛型方法來執行基本的數據操作(如查找、排序等)。

GPT:

第八階段:深入理解 C# 中的泛型(Generics)

1. 什麼是泛型?

泛型(Generics)允許我們在定義類別、方法或接口時,使用一個或多個未確定類型的參數。這樣可以在不具體指定數據類型的情況下創建靈活且可重用的代碼。

2. 為什麼我們需要泛型?

  • 類型安全:使用泛型可以在編譯時檢查類型,從而避免在運行時發生類型錯誤。
  • 代碼重用:泛型類別和方法可以處理多種數據類型,減少代碼重複。
  • 性能優化:泛型可以避免裝箱和拆箱操作(例如在使用集合時),從而提高性能。

3. 常見的泛型集合類別

  • **List**:一種動態數組,可以存儲多個相同類型的對象。
  • **Dictionary<TKey, TValue>**:一種鍵-值對集合,用於存儲具有唯一鍵的數據。

練習

  1. 創建一個泛型類來存儲不同類型的數據

    定義一個泛型類 Storage<T>,其中有一個方法 AddItem(T item) 用來添加項目,以及一個方法 GetItems() 返回所有項目。

  2. 使用泛型方法來執行基本的數據操作

    定義一個泛型方法 FindMax<T>(List<T> items),返回列表中的最大值。要求這些項目必須是可比較的(需要用到 IComparable 接口)。

問題

  1. 問題 1:泛型與非泛型類別相比,有哪些主要的優勢?請舉例說明。

  2. 問題 2:如何確保泛型類別中的數據類型具有某些特定的功能或屬性?例如,當你想在泛型方法中使用排序功能時。

  3. 問題 3:為什麼在創建一個集合類(例如 List<T>)時,使用泛型是更好的選擇?請說明原因。

GPT:
了解了!讓我們以類似的方式進行第八階段:深入理解 C# 中的泛型(Generics)。

第八階段:深入理解 C# 中的泛型(Generics)

1. 什麼是泛型?

泛型允許我們在類別、方法或接口的定義中使用未知的類型,這樣可以創建更靈活和可重用的代碼。泛型提供了類型安全的特性,使得我們能夠在編譯時檢查類型,從而減少運行時錯誤。

2. 為什麼我們需要泛型?

  • 類型安全:泛型在編譯時檢查類型,避免了不必要的類型轉換錯誤。
  • 代碼重用:同一泛型類別或方法可以處理多種數據類型,減少重複代碼。
  • 性能優化:使用泛型可以避免裝箱和拆箱操作,從而提高性能。

3. 常見的泛型集合類別

  • **List**:一種動態數組,可以存儲多個相同類型的對象。
  • **Dictionary<TKey, TValue>**:一種鍵-值對集合,用於存儲具有唯一鍵的數據。

練習

  1. 創建一個泛型類來存儲不同類型的數據

    定義一個泛型類 Storage<T>,並在裡面添加一個方法 AddItem(T item) 用來添加項目,以及一個方法 GetItems() 返回所有項目。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class Storage<T>
    {
    private List<T> items = new List<T>();

    public void AddItem(T item)
    {
    items.Add(item);
    }

    public List<T> GetItems()
    {
    return items;
    }
    }
  2. 使用泛型方法來執行基本的數據操作

    定義一個泛型方法 FindMax<T>(List<T> items),返回列表中的最大值。這要求這些項目必須實作 IComparable 接口。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public T FindMax<T>(List<T> items) where T : IComparable
    {
    if (items == null || items.Count == 0)
    throw new ArgumentException("The list cannot be null or empty.");

    T max = items[0];

    foreach (T item in items)
    {
    if (item.CompareTo(max) > 0)
    max = item;
    }

    return max;
    }

問題

  1. 問題 1:你如何理解泛型在 C# 中的主要優勢?請舉例說明。

  2. 問題 2:在何種情況下,使用泛型方法會比使用普通方法更好?

  3. 問題 3:為什麼使用泛型會提高性能,特別是在集合操作中?

完成這些問題後,請分享你的回答,然後我們可以討論你的理解,並繼續進行下一個階段的內容!

GPT:
好的!讓我們開始 第八階段:深入理解 C# 中的泛型(Generics)。在這一階段,我們將會學習以下內容:

1. 什麼是泛型?

泛型 是一種能夠讓類別、結構和方法在不指定具體數據類型的情況下,使用類型參數進行定義的功能。這使得我們可以編寫靈活且可重用的代碼。

2. 為什麼我們需要泛型?

泛型提供了以下優勢:

  • 類型安全:在編譯時期就能檢查類型,避免運行時錯誤。
  • 代碼重用:可以使用相同的代碼處理不同數據類型。
  • 性能優化:泛型避免了裝箱和拆箱(boxing and unboxing),提高性能。

3. 如何使用泛型來創建靈活且可重用的類別和方法?

以下是如何創建泛型類別和方法的範例:

泛型類別範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Box<T>
{
private T content;

public void Pack(T item)
{
content = item;
}

public T Unpack()
{
return content;
}
}

泛型方法範例

1
2
3
4
5
6
7
public class Utility
{
public static T GetMax<T>(T a, T b) where T : IComparable
{
return (a.CompareTo(b) > 0) ? a : b;
}
}

4. 常見的泛型集合類別

  • **List**:可變長度的集合,可以存儲同一類型的對象。
  • **Dictionary<TKey, TValue>**:存儲鍵值對的集合,快速查找數據。

實戰練習

練習 1:創建一個泛型類

  1. 創建一個泛型類 Container<T>,該類包含一個屬性 Item 用來存儲一個項目,以及 SetItemGetItem 方法來設置和獲取這個項目。

練習 2:使用泛型方法
2. 創建一個靜態方法 FindMax<T>(List<T> items),用來返回列表中最大的元素,要求 T 必須實現 IComparable 接口。

練習 3:使用泛型集合
3. 使用 List<T> 創建一個包含不同數字的集合,並使用 LINQ 查找最大值。


問題

  1. 問題: 泛型如何增強代碼的類型安全性?
  2. 問題: 使用泛型時,where 關鍵字的作用是什麼?

完成這些練習後,請分享你的解答和問題!如果有需要進一步探討的地方,隨時告訴我!