可能重复:
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");
}
}
}
答案 0 :(得分:5)
是。委托类型是一种类型。可以像使用(方法语法myDelegate(arg1, arg2)
)的方法一样调用委托类型的实例。委托可以被认为是强类型(因此是Type)方法指针。
答案 1 :(得分:0)
如果我没有错,委托总是一个类型,但它的实例可以与具有相同签名的方法相关联。这就是您在上面的代码中看到的内容。
doShow是一个类型,然后它的实例(使用new运算符)与作为参数传递给委托构造函数的方法相关联。
维杰
答案 2 :(得分:0)
您不应该将代表自己视为“方法”,即使您可以以相同的方式使用它们的实例。它们不是方法,而是类型。
它们是一种特殊类型,其实例可以包含对方法的引用。您为委托提供的“名称”不是方法名称,它是类型名称,就像任何类,枚举等一样。这种类型恰好描述了一个可以通过调用它来执行的对象,就像一个方法一样。 / p>
由于以下几个原因,区分委托和“方法名称”非常重要:
最重要的是 - 您不使用委托类型名称本身来调用关联的方法。您使用实例名称。鉴于您的样本,您不能说:
doShow("Hi");
委托可以保存对没有名称的匿名方法的引用,例如:
doShow s = delegate ( string s ) { Console.WriteLine(s); };
委托可以持有lamba表达式的引用,内部只是一种不同的方式来编写匿名委托方法,但表面看起来完全不同:
doShow s = x => Console.WriteLine(x);
多播委托(例如事件处理程序)可以一次保存对多个方法的引用,包括命名方法,匿名方法或lambas的任意组合。
myObject.MyEvent += ObjectEvent;
myObject.MyEvent += delegate ( object sender, EventArgs e ) { Console.WriteLine("Hi"); }
myObject.MyEvent += ( sender, e ) => Console.WriteLine("Hi again.");