使用委托而不是制作中间方法有什么好处?

时间:2011-10-09 17:58:07

标签: c# delegates

有理由使用它:

bool flag;

public Form1()
{
    if (flag) byDelegate = square;
    else byDelegate = cube;
    Text = byDelegate(3).ToString();          
}

int square(int i) { return i * i; }
int cube(int i) { return i * i * i; }

delegate int delegate1(int x);
delegate1 byDelegate;

而不是:

bool flag;

public Form2()
{
    Text = fakeDelegate(3).ToString(); 
}

int square(int i) { return i * i; }
int cube(int i) { return i * i * i; }

int fakeDelegate(int i)
{
    if (flag) return square(i);
    else return cube(i);
}

感谢。

4 个答案:

答案 0 :(得分:5)

代理通常异步使用,用于事件或传递给方法/类型,以便稍后可以调用委托指向的方法('函数指针')。在你的情况下,看起来没有优势,因为你正在同步地做所有事情。

例如

private Action<double> _performWhenFinished.

public Form1(Action<double> performWhenFinished)
{
    _performWhenFinished = performWhenFinished;        
}

public void CalculatePi()
{
   double pie = 0d;
    // Create a new thread, take 2 minutes to perform the task

    // Thread.Wait etc., then and run your delegate 
    _performWhenFinished(pie);
}

除非您希望代码通过这些声明提供更多含义,否则通常不需要在3.5以上声明自己的代理。 Action类型和Func类型(func提供带返回值的方法)可以节省您的工作量。

答案 1 :(得分:1)

为了解决你提到的确切情况,你会明确地使用一个代表来使事情变得过于复杂,如果你真的不明白幕后发生了什么,我会更加复杂(我不是说你不是吨)...

更一般地说,您可以将委托视为“契约”(或者如果您的背景是C / C ++,则可以将其视为“指向函数的指针”):您告诉编译器期望在该位置接收函数一个给定的参数列表并提供一个给定的输出(可能是void),但是你没有告诉它该函数到底做了什么。这使方法的主体与函数的实际实现“分离”,使您可以自由地从代码的不同部分传递几个不同的实现。

this主题上似乎有相当好的,更详尽的解释。

答案 2 :(得分:1)

在您描述的情况下,我认为使用委托没有任何好处。事实恰恰相反,因为如果没有别的东西让事情看起来更复杂。

使用委托的原因是,例如,如果您想允许外部代码指定要调用的函数,并且您事先不知道可能指定的所有函数。

答案 3 :(得分:1)

fakeDelegate根本不是委托:它只是一个方法调用(反过来调用另外两个方法之一)。

现在,代理人 - 包括lambdas和“匿名函数” - 非常有用的两个原因是:

  1. 委托允许将函数(或方法)视为第一类值。帖子中的第一个示例执行此操作,即使它是一个愚蠢的例子(我这样做)有时,但需要更大的背景来证明一种形式相对于另一种形式的有效性。更常见的情况是,我将此属性用于看起来像IDictionary<String,MyDelegate>的数据结构,然后用作map["foo"](bar)或类似的 - 如果没有首先没有大的丑陋的调度(或反射),则不能这样做-class函数值!

  2. A / new / delegate可以创建一个闭包 - 也就是说,它可以绑定当前词法范围中的自由变量。用普通方法无法做到这一点; cubesquare都不会创建闭包,即使方法组可以转换为委托。虽然上面的示例没有任何优势,但当“只需要将额外的一点点信息”传递给回调时,这可以非常方便。

  3. 由于这两个案例都没有(特别好)在这个例子中使用....

    快乐的编码。