来自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);
}
}
总结一下:语言委托不是模式本身,它只是允许您将函数作为第一类对象来操作。
委托模式是:
一种设计模式[...],其中一个对象不执行其声明的任务之一,而是将该任务委托给关联的帮助对象。
不幸的是,该页面没有详细说明何时使用它或从中衍生出什么模式,除了
委托模式是构成其他软件模式(例如组合(也称为聚合)、混合和方面)基础的基本抽象模式之一。
从描述委托的页面中,您可以看出它是将功能的实现委托给在运行时可能知道也可能不知道的类。当您说Foo.Bar()
时,它的实现可能会将执行委托Bar()
给前面提到的“帮助对象”。
现在对于 C# 委托,如前所述,这只是一个函数指针。它可以通过在编译时或运行时分配委托方法来帮助实现委托模式。
委托模式是对象将任务的责任委托给外部方法的一种方式。它使用委托来跟踪该方法。所以委托的一种用途是实现委托模式。
例如,该模式在List<T>.Sort(comparison)
方法中使用,其中排序算法使用您提供给它的委托来比较项目。