C#委托问题

时间:2011-07-14 17:36:00

标签: c# delegates

  

可能重复:
  What is Delegate?

在C#中,委托可以看作方法名称和类型名称。我的理解是对的吗?

喜欢“doShow [] items = new doShow [3];” dowShow是类型名称。 比如“doshow(new Class1()....)”dosShow是一个方法名/ /

我在这里阅读代码得到了这个结论:

public class TestDelegate
{
    // define a datatype as a method taking a string returning void
    public delegate void doShow(String s);

    public static void Main(string[] args) 
    {
        // make an array of these methods
        doShow[] items = new doShow[3];

        items[0] = new doShow(new Class1().show);
        items[1] = new doShow(new Class2().display);
        items[2] = new doShow(Class3.staticDisplay);

        // call all items the same way
        for(int i = 0; i < items.Length; i++) {
            items[i]("Hello World");
        }
    }
}

3 个答案:

答案 0 :(得分:5)

是。委托类型是一种类型。可以像使用(方法语法myDelegate(arg1, arg2))的方法一样调用委托类型的实例。委托可以被认为是强类型(因此是Type)方法指针。

答案 1 :(得分:0)

如果我没有错,委托总是一个类型,但它的实例可以与具有相同签名的方法相关联。这就是您在上面的代码中看到的内容。

doShow是一个类型,然后它的实例(使用new运算符)与作为参数传递给委托构造函数的方法相关联。

维杰

答案 2 :(得分:0)

您不应该将代表自己视为“方法”,即使您可以以相同的方式使用它们的实例。它们不是方法,而是类型。

它们是一种特殊类型,其实例可以包含对方法的引用。您为委托提供的“名称”不是方法名称,它是类型名称,就像任何类,枚举等一样。这种类型恰好描述了一个可以通过调用它来执行的对象,就像一个方法一样。 / p>

由于以下几个原因,区分委托和“方法名称”非常重要:

  1. 最重要的是 - 您不使用委托类型名称本身来调用关联的方法。您使用实例名称。鉴于您的样本,您不能说:

    doShow("Hi");
    
  2. 委托可以保存对没有名称的匿名方法的引用,例如:

    doShow s = delegate ( string s ) { Console.WriteLine(s); };
    
  3. 委托可以持有lamba表达式的引用,内部只是一种不同的方式来编写匿名委托方法,但表面看起来完全不同:

    doShow s = x => Console.WriteLine(x);
    
  4. 多播委托(例如事件处理程序)可以一次保存对多个方法的引用,包括命名方法,匿名方法或lambas的任意组合。

    myObject.MyEvent += ObjectEvent;
    myObject.MyEvent += delegate ( object sender, EventArgs e ) { Console.WriteLine("Hi"); }
    myObject.MyEvent += ( sender, e ) => Console.WriteLine("Hi again.");