[教材]
オンライン>ドキュメント
公式文書:https://docs.microsoft.com/zh-cn/dotnet/csharp/
ルーキーチュートリアル(上級チュートリアル):https://www.runoob.com/csharp/csharp-tutorial.html
>ビデオチュートリアル
テンセント大学、シキ・カレッジ
>ブックス
"C#のグラフィックチュートリアル" (章17) :https://www.cnblogs.com/moonache/p/7687551.html
[学習]
>ルーキーチュートリアル:高度なチュートリアルセクション(ジェネリック)
> "C#のグラフィックのチュートリアル"(第17章)
【注意事項】
- 定義
- そして、中にC ++のテンプレートテンプレート<T>など
- ジェネリック型を使用することができる:クラス、構造体、インターフェイス、デリゲート、方法
- 注:一般的なだけでなく、T、複数のジェネリックT1、T2、T3を定義することができます...
- ジェネリッククラス(クラス)
- 不明なタイプのTは、作成時に、目的は、よりマイリストの過負荷を避けるために決定しました
-
// Tは、オブジェクト作成時に決定されるタイプ パブリック クラス MYLISTの <T> { プライベート int型のサイズ= 10 ; 公共T []の値; 公共MYLISTの() { 値 =新しい新しいT [サイズ]; } } 無効スタート() { MYLISTのを <整数 > = myList_int新しい新規 MYLIST <の整数 >(); // T INTに MYLISTの <ストリング > = myList_string新しい新規 MYLISTの<文字列> (); // T为列 myList_int.values [ 0 ] = 1 ; myList_string.values [ 0 ] = " アリス" 。 }
- 一般的な機能
- リダクション関数のオーバーロード、ジェネリックT適応パラメータのすべての異なる種類の
-
// 交换和B 公共 ボイド SwapValue <T> ( REF T A、 REF T B) { TのTEMP =。= B; B = TEMP。 } ボイド開始() { int型 I1 = 1、I2 = 2 。 文字列 S1 = " アリス"、S2 = " ボブ" ; SwapValue(REF I1、参考文献3-12)。// T为のint SwapValue(REF S1、REF S2); // Tは、ストリング DEBUG.LOG(I1); // 出力:2 DEBUG.LOG(S1); // 出力:ボブ }
- ジェネリックデリゲート
- ジェネリッククラス定義と同様に
-
// 泛型委托 デリゲート T NumberChanger <T> (T、TのB)。 公共 int型 AddNum(int型、int型B) { 返す +のBと、 } パブリック 文字列 AddString(列 A、列B) { 返す +のBと、 } ボイド開始() { // T为INT NumberChanger < INT > numberChanger_int = 新しい NumberChanger < 整数 > (AddNum)。 // T为文字列 NumberChanger < 文字列 > numberChanger_string = 新しい NumberChanger < 文字列 > (AddString)。 }
- マルチ定義された一般的なT
- ジェネリックは、必ずしも唯一のTは、また、複数の、T1、T2、T3を定義することができ...
-
// 複数のTジェネリックデリゲート デリゲート T3 NumberChanger <Tlの、T2、T3> (TL A、T2 B); // int型フロートまた、文字列を返す パブリック ストリング AddNumToString(int型 A、フロートB) { リターン(A +をB).ToString(); } 無効(スタート) { // 一般的な変数を作成 numberChanger < 整数、浮動小数点、文字列 > = numberChanger 新しい新しい numberChanger < 整数、浮動小数点、文字列 > (AddNumToString); }
- 一般的な制約(WHERE )
- Tは、背後にある汎用コードの定義に加えて、ジェネリック型制約のある XXX:T WHERE 、xxxは型T必見を表し、
-
- 例えば:
-
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>(); }