新运算符如何与 C# 中的委托一起工作
How new operator works with delegates in C#
在此代码段中,new MyDel(this.WelcomeUser) 是如何工作的?内存中发生了什么,我知道委托是引用类型,那么是否有在堆中创建的对象,它是什么类型的对象-MyDel? this.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#
在此代码段中,new MyDel(this.WelcomeUser) 是如何工作的?内存中发生了什么,我知道委托是引用类型,那么是否有在堆中创建的对象,它是什么类型的对象-MyDel? this.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
指当前classWelcomeUser
指的是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#