0Pricing
C# Academy · レッスン

delegate、Action/Func、クロージャ

delegateを使って動作を渡します。独自のdelegateを宣言し、組み込みのAction/Funcを使い、ラムダ式が変数をキャプチャする仕組み(クロージャ)を確認します。

「delegate、Action/Func、クロージャ」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全3レッスンが含まれています。

デリゲートの概要

目標: メソッドをデータとして扱います。

  • デリゲート型を定義します
  • Action/Funcを使用します
  • ラムダ式を作成します
  • クロージャ(キャプチャされた変数)を理解します

カスタムデリゲートの基礎

デリゲートは、型安全な関数ポインターです。互換性のあるメソッドを割り当て、関数と同じように呼び出せます。

using System;

// Custom delegate type: a method taking two ints and returning int
public delegate int Op(int x, int y);

public class Program
{
  static int Add(int a, int b) { return a + b; }
  static int Mul(int a, int b) { return a * b; }

  public static void Main(string[] args)
  {
    Op f = Add;                // method group conversion
    Console.WriteLine(f(2, 3)); // 5
    f = Mul;
    Console.WriteLine(f(2, 3)); // 6
  }
}

Action と Func

Actionは void を返すメソッドを表し、Funcは値を返します。メソッドグループまたはラムダ式を使用します。

using System;

public class Program
{
  static void Log(string s) { Console.WriteLine("LOG: " + s); }

  public static void Main(string[] args)
  {
    Action<string> a = Log;                        // no return
    a("hello");

    Func<int, int, int> sum = delegate(int x, int y) { return x + y; }; // lambda/anon method
    Console.WriteLine(sum(3, 4)); // 7

    // Method group to Func
    Func<string, int> len = GetLen;
    Console.WriteLine(len("abc")); // 3
  }

  static int GetLen(string s) { return s == null ? 0 : s.Length; }
}

クロージャの例

クロージャは、外側のスコープにある変数をキャプチャします。その変数は、デリゲートを作成したメソッドが終了した後も存続します。

using System;

public class Program
{
  public static void Main(string[] args)
  {
    int counter = 0; // captured variable (lives as long as delegate)
    Action inc = delegate() { counter = counter + 1; Console.WriteLine(counter); };

    inc(); // 1
    inc(); // 2
    Console.WriteLine("Final=" + counter); // 2
  }
}

高階メソッド

FuncまたはActionを渡して、動作をカスタマイズします。これは多くの API(および LINQ)の基盤です。

using System;

public class Program
{
  // Apply a transform to each number and sum the results
  static int SumBy(int[] xs, Func<int, int> transform)
  {
    int total = 0;
    for (int i = 0; i < xs.Length; i++)
    {
      total += transform(xs[i]);
    }
    return total;
  }

  public static void Main(string[] args)
  {
    int[] data = new int[] { 1, 2, 3 };
    int sumSquares = SumBy(data, delegate(int x) { return x * x; });
    Console.WriteLine(sumSquares); // 14
  }
}

デリゲートのヒント

ヒント:

  • 追加のカスタムデリゲート型を避けるため、Action/Funcを優先します。
  • ラムダ式は短く、わかりやすく保ちます。
  • キャプチャされた変数に注意してください。後で値が変わる可能性があります。
  • 名前付きメソッドがすでにシグネチャに一致する場合は、メソッドグループを使用します。

Func と Action の意味

簡単な確認です。値を返すメソッドを表す組み込みデリゲート型はどれでしょうか?

まとめ

まとめ: デリゲートを宣言し、Action/Funcを使用して、小さなラムダ式を記述します。クロージャを使うとラムダ式でローカル変数をキャプチャできますが、慎重に使用してください。

よくある質問

「delegate、Action/Func、クロージャ」レッスンは無料ですか?

はい。「delegate、Action/Func、クロージャ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全3レッスンが含まれています。

「delegate、Action/Func、クロージャ」で何を学びますか?

delegateを使って動作を渡します。独自のdelegateを宣言し、組み込みのAction/Funcを使い、ラムダ式が変数をキャプチャする仕組み(クロージャ)を確認します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/3です。

「delegate、Action/Func、クロージャ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

  1. delegate、Action/Func、クロージャ
  2. イベント:発行と購読、eventキーワード
  3. イベントパターンと注意点(メモリリーク)
← C# Academyに戻る