C#代表问题
本文关键字:问题 | 更新日期: 2023-09-27 18:02:12
可能重复:
什么是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");
}
}
}
是。委托类型是一种类型。可以像具有(方法语法myDelegate(arg1, arg2)
(的方法一样调用委托类型的实例。委托可以被视为强类型(因此被称为Type(方法指针。
如果我没有错的话,委托总是一个类型,但它的实例可以关联到具有相同签名的方法。这就是您在上面的代码中看到的内容。
doShow是一个类型,然后它的实例(使用新运算符(与作为参数传递给委托构造函数的方法相关联。
Vijay
您不应该将委托本身视为"方法",即使您可以以大致相同的方式使用它们的实例。它们不是方法,而是类型。
它们是一种特殊类型,其实例可以包含对方法的引用。你给委托的"名称"不是方法名,而是类型名,就像任何类、枚举等。这种类型恰好描述了一个可以通过调用它来执行的对象,就像方法一样。
区分委托和"方法名称"很重要,原因有几个:
-
最重要的是,您不使用委托类型名称本身来调用关联的方法。您使用实例名称。给定您的样本,您不能说:
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.");