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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- delegate、Action/Func、クロージャ
- イベント:発行と購読、eventキーワード
- イベントパターンと注意点(メモリリーク)