0Pricing
C# Academy · レッスン

ジェネリックメソッド/型と制約

ジェネリックメソッドとジェネリック型を書き、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() 制約の意味

確認問題: ジェネリックコード内で new T() を作成できるようにする制約はどれですか?

まとめ

まとめ: ジェネリックメソッド/型を作成し、必要なメンバーを使用するために制約を追加します。振る舞いにはインターフェイス/基底クラス、種類の指定には 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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ジェネリックメソッド/型と制約
  2. インターフェースとデリゲートにおける変性(in/out)
  3. Nullable reference types(認識)と注釈(C# 6パターン)
← C# Academyに戻る