iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0
Software Development

C# 學習之路系列 第 18

[DAY17] C#基礎與實作(泛型)

  • 分享至 

  • xImage
  •  

C# 程式基礎

泛型 (Generics):

泛型是 C# 中的一個重要特性,它允許您創建可重用的程式碼,不需要對不同的資料類型進行多次實作。

泛型 - 基本概念:

泛型允許您定義類型參數化的類別、結構、方法和介面。這表示您可以在不指定具體資料類型的情況下,定義通用的程式碼,並在使用時指定資料類型。
  • 程式範例(創建一個泛型類別 GenericList<T>,以儲存不同資料類型的元素):
    public class GenericList<T>
    {
        private List<T> list = new List<T>();
    
        public void Add(T value)
        {
            list.Add(value);
        }
    
        public T Get(int index)
        {
            if (index >= 0 && index < list.Count)
            {
                return list[index];
            }
            throw new IndexOutOfRangeException("索引超出範圍");
        }
    }
    

使用泛型類別:

當使用泛型類別時,您可以指定資料類型作為類型引數,使其變成具體的資料結構。
  • 程式範例(使用 GenericList 來儲存整數和字串):
    GenericList<int> intList = new GenericList<int>();
    intList.Add(1);
    intList.Add(2);
    
    GenericList<string> stringList = new GenericList<string>();
    stringList.Add("Hello");
    stringList.Add("World");
    

泛型方法:

泛型不僅適用於類別,還可以用於方法。這使您可以創建能夠處理多種資料類型的通用方法。
  • 程式範例(創建一個泛型方法 Swap,用於交換兩個變數的值。):

    public static void Swap<T>(ref T a, ref T b)
    {
        T temp = a;
        a = b;
        b = temp;
    }
    

    使用 Swap 方法可以交換不同資料類型的變數。

  • 程式範例:

    int x = 5, y = 10;
    Swap(ref x, ref y);
    
    string str1 = "Hello", str2 = "World";
    Swap(ref str1, ref str2);
    

泛型限制:

有時候,需要對泛型類型施加一些約束,以確保滿足特定要求。

這可以通過泛型約束來實現。

  • 程式範例(創建一個泛型方法 AreEqual,比較兩個物件是否相等):

    //這個方法僅允許比較實作了 IComparable<T> 介面的物件。
    public static bool AreEqual<T>(T a, T b) where T : IComparable<T>
    {
        return a.CompareTo(b) == 0;
    }
    
  • 程式範例:

    int num1 = 5, num2 = 5;
    bool intResult = AreEqual(num1, num2); 
    // 正確,因為整數實作了 IComparable<int>
    
    Person person1 = new Person("Alice"), person2 = new Person("Bob");
    bool personResult = AreEqual(person1, person2); 
    // 錯誤,因為 Person 未實作 IComparable<Person>
    

程式實作練習:

  • 題目:
      請創建一個泛型類別 DataContainer,它可以儲存任何資料型別的數據。
    並創建一個泛型方法 AreEqual,它可以接受兩個 DataContainer 的實例,
    並比較它們是否包含相同的數據。
    (1)比較int 資料1: 5,int資料2: 5 是否相同
    (2)比較string 資料1:"Hello",int資料2: "World" 是否相同
    預期輸出:
    整數資料是否相等:True
    字串資料是否相等:False

  • 程式實作:

    public class DataContainer<T>
    {
        private T data;
    
        public DataContainer(T data)
        {
            this.data = data;
        }
    
        public T GetData()
        {
            return data;
        }
    }
    
    internal class Program
    {
        public static bool AreEqual<T>(DataContainer<T> container1, 
                    DataContainer<T> container2)
        {
            T data1 = container1.GetData();
            T data2 = container2.GetData();
            return data1.Equals(data2);
        }
    
    
        static void Main(string[] args)
        {
            // 創建兩個整數資料
            DataContainer<int> intContainer1 = 
                        new DataContainer<int>(5);
            DataContainer<int> intContainer2 =
                        new DataContainer<int>(5);
    
            // 創建兩個字串資料
            DataContainer<string> stringContainer1 =
                    new DataContainer<string>("Hello");
            DataContainer<string> stringContainer2 = 
                    new DataContainer<string>("World");
    
            // 比較整數資料
            bool intEqual = AreEqual(intContainer1, intContainer2); 
            // 返回 true
    
            // 比較字串資料
            bool stringEqual = AreEqual(stringContainer1, stringContainer2); 
            // 返回 false
    
            Console.WriteLine("整數資料是否相等:" + intEqual);
            Console.WriteLine("字串資料是否相等:" + stringEqual);
        }
    }
    

參考來源

  1. ChatGPT
  2. C#最強入門邁向頂尖高手之路王者歸來
  3. w3schools C#

期望挑戰30天持續更新成功 ~ DAY17


上一篇
[DAY16] C#基礎與實作(異步程式設計)
下一篇
[DAY18] C#基礎與實作(LINQ)
系列文
C# 學習之路31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言