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");
        }
    }
}

C#代表问题

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

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

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

Vijay

您不应该将委托本身视为"方法",即使您可以以大致相同的方式使用它们的实例。它们不是方法,而是类型。

它们是一种特殊类型,其实例可以包含对方法的引用。你给委托的"名称"不是方法名,而是类型名,就像任何类、枚举等。这种类型恰好描述了一个可以通过调用它来执行的对象,就像方法一样。

区分委托和"方法名称"很重要,原因有几个:

  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.");