新运算符如何与 C# 中的委托一起工作

How new operator works with delegates in C#

在此代码段中,new MyDel(this.WelcomeUser) 是如何工作的?内存中发生了什么,我知道委托是引用类型,那么是否有在堆中创建的对象,它是什么类型的对象-MyDelthis.WelcomeUser到底是什么?它是对方法的引用吗?

using System;
namespace SampleApp {
public delegate string MyDel(string str);

class EventProgram {
  event MyDel MyEvent;

  public EventProgram() {
     this.MyEvent += new MyDel(this.WelcomeUser);
  }
  public string WelcomeUser(string username) {
     return "Welcome " + username;
  }
  static void Main(string[] args) {
     EventProgram obj1 = new EventProgram();
     string result = obj1.MyEvent("Tutorials Point");
     Console.WriteLine(result);
  }
 }
}

Is it a reference to a function?

是的,但是我们在C#中一般称它们为方法

  • this指当前class
  • WelcomeUser指的是class中的方法名。

new MyDel 调用期望提供一个方法的名称,该方法采用字符串参数和 returns 一个字符串(即与 [=15= 的输入和输出相匹配的东西) ]).任何符合此的方法都是可以接受的

看一个事件引发者和消费者处于不同 classes:

的例子可能更有意义
using System;

public delegate string MyDel(string str);

class EventEmitter {
  event MyDel MyEvent;
}

class EventConsumer{

  private EventEmitter x = new EventEmitter();

  public EventConsumer() {
     x.MyEvent += new MyDel(this.MyEventHandler);
  }

  public string MyEventHandler(string username) {
     return "Welcome " + username;
  }

}

这里 EventConsumer 现在可以知道 EventEmitter 何时引发了它的事件。 EventEmitter 不知道消费者内部的任何方法,它们的名称是什么等等。The.NET 运行时将调用附加到发射器事件的方法(在消费者中)。可以附加多个处理程序:

class EventConsumer{

  private EventEmitter x = new EventEmitter();

  public EventConsumer() {
     x.MyEvent += new MyDel(this.MyEventHandler);
     x.MyEvent += new MyDel(this.MyEventHandler2);
  }

  public string MyEventHandler(string username) {
     return "Welcome " + username;
  }
  public string MyEventHandler2(string username) {
     return "Goodbye " + username;
  }

}

事件引发时,它们都将被调用 (but in what order is not guaranteed)..

事件机制很重要,因为它允许我们提供一种方法来提醒其他 class 事情已经发生,而无需知道任何有关 class 的事情。明显的用途类似于 Button class - Microsoft 不知道他们在编写 Button 时会调用什么处理按钮单击的方法,因此他们只提供一个名为 Click 的事件,然后您将任何方法附加到当用户按下按钮时处理点击的兼容签名

how does new MyDel(this.WelcomeUser) work?

这是对构造函数的调用,以 this.WelcomeUser 作为参数。

public delegate string MyDel(string str);

是类型定义。编译器使用它来生成从 System.Delegate 派生的 class。请注意,这是在 C# 具有泛型之前设计的。

what is exactly this.WelcomeUser?

方法名。在 C#(和 C、C++ 等)中,方法后始终跟有参数(或参数)列表,即使该列表为空:SomeMethod().
省略列表等同于地址。

看VB.NET就更清楚了,等价代码是

MyEvent += new MyDel(this.WelcomeUser);       // C#

AddHandler MyEvent, AddressOf Me.WelcomeUser  ' VB

从 C# 2 开始,您可以使用短符号:

MyEvent += this.WelcomeUser;       // modern C#