MSDNドキュメントから:
デリゲートは、CおよびC ++の関数ポインターと同様に、メソッドを安全にカプセル化する型です。C関数ポインタとは異なり、デリゲートはオブジェクト指向であり、タイプセーフであり、セキュアです。
私はそれが何であるか、そしてそれをどのように使うかを知っています。しかし、私が知っている(ウィキペディアからの)デリゲートパターンに基づいて書かれているのではないかと思います。
それらの違いは何ですか?
MSDNドキュメントから:
デリゲートは、CおよびC ++の関数ポインターと同様に、メソッドを安全にカプセル化する型です。C関数ポインタとは異なり、デリゲートはオブジェクト指向であり、タイプセーフであり、セキュアです。
私はそれが何であるか、そしてそれをどのように使うかを知っています。しかし、私が知っている(ウィキペディアからの)デリゲートパターンに基づいて書かれているのではないかと思います。
それらの違いは何ですか?
C# (パターンではない) デリゲートは、デリゲート パターンを実装するときに役立つ場合があります。変更を加えたウィキペディアからのこのデリゲート パターンの実装を見てください。
//NOTE: this is just a sample, not a suggestion to do it in such way
public interface I
{
void F();
void G();
}
public static class A
{
public static void F() { System.Console.WriteLine("A: doing F()"); }
public static void G() { System.Console.WriteLine("A: doing G()"); }
}
public static class B
{
public static void F() { System.Console.WriteLine("B: doing F()"); }
public static void G() { System.Console.WriteLine("B: doing G()"); }
}
public class C : I
{
// delegation
Action iF = A.F;
Action iG = A.G;
public void F() { iF(); }
public void G() { iG(); }
// normal attributes
public void ToA() { iF = A.F; iG = A.G; }
public void ToB() { iF = B.F; iG = B.G; }
}
public class Program
{
public static void Main()
{
C c = new C();
c.F(); // output: A: doing F()
c.G(); // output: A: doing G()
c.ToB();
c.F(); // output: B: doing F()
c.G(); // output: B: doing G()
}
}
ここでもデリゲートが役立つかもしれませんが、導入されたわけではありません。パターンではなく、低レベルの構築のように見る必要があります。イベントとのペアでは、パブリッシャー/サブスクライバー (オブザーバー) パターンを実装するために使用できます。この記事を参照するか、ビジター パターンを実装するのに役立つ場合があります。これはLINQで積極的に使用されています。
public void Linq1()
{
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
// n => n < 5 is lambda function, creates a delegate here
var lowNums = numbers.Where(n => n < 5);
Console.WriteLine("Numbers < 5:");
foreach (var x in lowNums)
{
Console.WriteLine(x);
}
}
要約すると、言語デリゲートはパターン自体ではなく、関数をファースト クラス オブジェクトとして操作できるようにするだけです。
委任パターンは次のとおりです。
オブジェクトが、指定されたタスクの 1 つを実行する代わりに、そのタスクを関連付けられたヘルパー オブジェクトに委任するデザイン パターン [...]。
残念ながら、そのページでは、それをいつ使用するか、またはそこから派生するパターンについてはあまり説明されていません。
委譲パターンは、コンポジション (アグリゲーションとも呼ばれます)、ミックスイン、アスペクトなどの他のソフトウェア パターンの基礎となる基本的な抽象化パターンの 1 つです。
delegation について説明しているページから、機能の実装を、実行時に認識されているかどうかわからないクラスに委任することであることがわかります。というとFoo.Bar()
、その実装は前述の「ヘルパーオブジェクト」にの実行を委譲することがあります。Bar()
前述のように、C# デリゲートの場合、これは単なる関数ポインターです。コンパイル時または実行時に委譲メソッドを割り当てることにより、委譲パターンの実装に役立ちます。
委任パターンは、オブジェクトがタスクの責任を外部メソッドに委任する方法です。デリゲートを使用してそのメソッドを追跡します。したがって、デリゲートの用途の 1 つは、委任パターンを実装することです。
このパターンは、たとえばList<T>.Sort(comparison)
メソッドで使用されます。この場合、ソート アルゴリズムは、提供されたデリゲートを使用してアイテムを比較します。