在C#中委托模式与委托关键字

时间:2012-06-13 07:13:36

标签: c# design-patterns delegates

来自MSDN doc

  

委托是一种安全封装方法的类型,类似于   C和C ++中的函数指针。与C函数指针,委托不同   面向对象,类型安全,安全。

我知道它是什么以及如何使用它。但我想知道它是否是基于我所知的委托模式(来自wikipedia) 他们之间有什么区别?

3 个答案:

答案 0 :(得分:6)

当您实现delegate pattern时,使用我的更改从维基百科中查看此委托模式实现时,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()
    }
}

再次委托可能在这里有用,但不是因为它被引入。你应该在低层建筑而不是模式上看待它。在与events配对的情况下,它可用于实施publisher/subscriber(observer) pattern - 只需查看this article,或者它有时可以帮助您实施visitor pattern - 这是积极使用的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); 
    } 
} 

总结一下:语言委托不是模式本身,它只允许您将函数作为first class objects进行操作。

答案 1 :(得分:2)

delegation pattern是:

  

一种设计模式,其中一个对象而不是执行其声明的任务之一,将该任务委托给关联的辅助对象。

不幸的是,除了

之外,该页面没有详细说明何时使用它或从中获得什么模式。
  

委托模式是构成其他软件模式的基本抽象模式之一,例如组合(也称为聚合),混合和方面。

describes delegation的页面,您可以确定将功能的实现委托给在运行时可能知道或可能不知道的类。当你说Foo.Bar()时,它的实现可以委托执行Bar()到前面提到的“帮助对象”。

现在对于C#委托,如上所述,这只是一个函数指针。它可以通过在编译时或运行时分配委托方法来帮助实现委派模式。

答案 2 :(得分:0)

委托模式是对象将任务的责任委派给外部方法的一种方式。它使用委托来跟踪该方法。因此,委托的一个用途是实现委托模式

该模式用于List<T>.Sort(comparison)方法,其中排序算法使用您提供的委托来比较项目。