【Unity|C#】基礎篇(10)——泛型(Generic)/ 泛型約束條件(where)


【學習資料】

  《C#圖解教程》(第17章)https://www.cnblogs.com/moonache/p/7687551.html
  電子書下載:https://pan.baidu.com/s/1mhOmBG0

 

【內容】 

    • 定義
    • 泛型類(class)
    • 泛型函數
    • 泛型委托
    • 多個泛型定義(T1、T2、T3)
    • 泛型的約束條件(where)

 


【筆記】

  • 定義
    • 與C++中的模板template<T>一樣
    • 可使用泛型的類型:類、結構、接口、委托、方法
    • 注:泛型不只有一個T,可以定義多個泛型T1、T2、T3 ...

 

  •  泛型類(class)
    • 未知類型T,在創建對象時確定,這樣可以避免重載多個MyList
    • // T的類型在創建對象時確定
      public class MyList<T>
      {
          private int size = 10;
          public T[] values;
          public MyList()
          {
              values = new T[size];
          }
      }
      
      void Start()
      {
          MyList<int> myList_int = new MyList<int>();          // T 為 int
          MyList<string> myList_string = new MyList<string>(); // T 為 string
          myList_int.values[0] = 1;
          myList_string.values[0] = "Alice";
      }
  • 泛型函數
    • 減少函數重載,一個泛型T適配所有不同類型的參數
    • // 交換a和b
      public void SwapValue<T>(ref T a, ref T b)
      {
          T temp = a;
          a = b;
          b = temp;
      }
      
      void Start()
      {
          int i1 = 1, i2 = 2;
          string s1 = "Alice", s2 = "Bob";
      
          SwapValue(ref i1, ref i2); // T 為 int
          SwapValue(ref s1, ref s2); // T 為 string
          Debug.Log(i1); // 輸出:2
          Debug.Log(s1); // 輸出:Bob
      }
  • 泛型委托
    • 與泛型類定義類似
    • // 泛型委托
      delegate T NumberChanger<T>(T a, T b);
      
      public int AddNum(int a, int b)
      {
          return a + b;
      }
      public string AddString(string a, string b)
      {
          return a + b;
      }
      
      void Start()
      {
          // T 為 int
          NumberChanger<int> numberChanger_int = new NumberChanger<int>(AddNum);
          // T 為 string
          NumberChanger<string> numberChanger_string = new NumberChanger<string>(AddString);
      } 

 

  • 多泛型T定義
    • 泛型不一定只有一個T,也可以定義多個,T1、T2、T3 ...
    • // 多泛型T委托
      delegate T3 NumberChanger<T1, T2, T3>(T1 a, T2 b);
      
      // int 與 float 相加,返回string
      public string AddNumToString(int a, float b)
      {
          return (a + b).ToString();
      }
      
      void Start()
      {
          // 創建泛型變量
          NumberChanger<int, float, string> numberChanger = new NumberChanger<int, float, string>(AddNumToString);
      }

 

  • 泛型的約束條件(where
    • 對泛型T進行類型約束,在定義為泛型的代碼后面加  where T: xxx ,表示T必須為xxx類型

    • 舉例:
    • public class Major // 職業
      {
      
      };
      public class Teacher : Major // 教師
      {
      
      }
      
      public class Person<T1, T2, T3> 
          where T1 : class    // T1 必須是個類 類型
          where T2 : struct   // T2 必須是個結構 類型
          where T3 : Major    // T3 必須是基類為Major的類 
      {
          T1 value1;
          T2 value2;
          T3 value3;
      }
      
      void Start()
      {
          // 報錯:T1和T3不滿足約束條件
          //Person<int, int, int> person1 = new Person<int, int, int>();
      
          // 正確:
          //  string  類型為 class System.String
          //  int     類型為 struct System.Int32
          //  Teacher 類型為 class Major
          Person<string, int, Teacher> person2 = new Person<string, int, Teacher>(); 
      }

       

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM