ジェネリックメソッド/型と制約
ジェネリックメソッドとジェネリック型を書き、where T : …(class、struct、new()、インターフェース/基底クラス)で制約を追加します。
「ジェネリックメソッド/型と制約」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全3レッスンが含まれています。
ジェネリックの概要
目標: ジェネリックを使用してコードを安全に再利用します。
- ジェネリックメソッドとジェネリック型
- 制約: class、struct、new()、インターフェイス/基底クラス
- 例は小さく明確に保ちます
ジェネリックメソッド
ジェネリックメソッドには型パラメーターのリスト(例: Identity<T>)があり、多くの型で動作します。
using System;
// Generic method works for any T
public class Program
{
static T Identity<T>(T value)
{
// just returns what it got
return value;
}
public static void Main(string[] args)
{
int a = Identity<int>(5);
string b = Identity<string>("hi");
Console.WriteLine(a + " & " + b);
}
}
ジェネリック型
ジェネリック型(Box<T> など)は 1 回コンパイルされ、多くの具体的な型で使用されます。
using System;
// Simple generic type to hold a value
public sealed class Box<T>
{
private T _value;
public Box(T value) { _value = value; }
public T Get() { return _value; }
public void Set(T value) { _value = value; }
}
public class Program
{
public static void Main(string[] args)
{
Box<int> bi = new Box<int>(10);
Box<string> bs = new Box<string>("ok");
Console.WriteLine(bi.Get() + " | " + bs.Get());
}
}
new() 制約
ジェネリックコード内で new T() を呼び出す必要がある場合は、where T : new() を追加します。
using System;
// Factory that can create T with a parameterless ctor
public static class Factory
{
public static T Create<T>() where T : new()
{
return new T(); // allowed thanks to new() constraint
}
}
public sealed class Person
{
public string Name;
public Person() { Name = "Anon"; }
}
public class Program
{
public static void Main(string[] args)
{
Person p = Factory.Create<Person>();
Console.WriteLine(p.Name);
}
}
インターフェイス制約
T をインターフェイスまたは基底クラスに制約すると、そのメンバーを呼び出せます(例: IComparable<T>)。
using System;
// Min for two values that can be compared
public static class Utils
{
public static T Min<T>(T a, T b) where T : IComparable<T>
{
return a.CompareTo(b) <= 0 ? a : b;
}
}
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine(Utils.Min(5, 3)); // 3
Console.WriteLine(Utils.Min("b", "a")); // a
}
}
class/struct 制約とヒント
その他の制約:
- where T : class → 参照型のみ
- where T : struct → null 非許容の値型
- 制約を組み合わせられます: where T : class, IDisposable, new()
- API は最小限に保ち、柔軟性のためにインターフェイス制約を優先してください。
new() 制約の意味
まとめ
まとめ: ジェネリックメソッド/型を作成し、必要なメンバーを使用するために制約を追加します。振る舞いにはインターフェイス/基底クラス、種類の指定には class/struct、引数なしコンストラクターの呼び出しには new() を使用します。
よくある質問
「ジェネリックメソッド/型と制約」レッスンは無料ですか?
はい。「ジェネリックメソッド/型と制約」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全3レッスンが含まれています。
「ジェネリックメソッド/型と制約」で何を学びますか?
ジェネリックメソッドとジェネリック型を書き、where T : …(class、struct、new()、インターフェース/基底クラス)で制約を追加します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/3です。
「ジェネリックメソッド/型と制約」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。