【发布时间】:2017-03-09 08:12:45
【问题描述】:
我已经阅读了很多关于委托和事件的材料和示例,但我真的很难理解 C# 中的事件。我知道委托实际上是方法指针,您可以在调用委托时添加方法然后一起执行,假设它符合委托的输入参数和返回类型。
(我很清楚堆栈溢出时会解释事件,但甚至没有帮助我理解)
我将分享我的代码,它正在运行,但我不明白
namespace Delegates2 {
class Program {
static void Main(string[] args) {
Car mazda = new Car("Mazda");
Person chris = new Person();
mazda.Drive += chris.OnPersonDrive;
mazda.StartJourney();
Console.ReadKey();
}
}
public delegate void DriverCarEventHandler(object obj, EventArgs e);
public class Car
{
public string Name { get; }
public event DriverCarEventHandler Drive;
public Car(string name) {
Name = name;
}
public void StartJourney() {
OnDrive();
}
protected virtual void OnDrive() {
if (Drive != null) {
Drive(this, EventArgs.Empty);
}
}
}
public class Person
{
public void OnPersonDrive(Object source, EventArgs e) {
Console.WriteLine("Driving....");
}
}
}
这是我所有的困惑点......
- 委托声明中的“Object obj”和“EventArgs e”有何作用 代表?因为学习似乎这些都是空的。什么可能是这些可能需要不同的示例?
- 当您基于委托创建事件时,是否 事件现在存储所有指向方法的指针还是它仍然是 代表?我听说过有关将订阅者添加到 事件。这些“订阅者”是否只是以与您相同的方式使用的方法 向代表添加方法?
- 显然 OnDrive() 方法正在“引发”事件。 “引发”事件与执行事件相同吗 事件?那么执行附加到事件的所有订阅者?
- 为什么当你发起一个事件时它必须符合 委托输入参数? (这个,EventArgs.Empty)。难道不是 只有需要匹配此格式的订阅者?
【问题讨论】:
-
“我知道委托实际上是方法指针,您可以添加方法,然后在调用委托时一起执行”——这正是事件的含义。它们是从您的对象公开的委托,您可以将方法指针添加到对象本身希望引发它们时执行的方法指针。委托和事件之间的主要区别在于,事件只能由持有它们的类引发(执行),而委托可以由任何代码执行。
-
您不需要在委托中添加对象和事件参数......它们是您自己制作的事件。您可以不添加任何参数或仅添加字符串或其他内容 -_-
-
@PeterDuniho Point 仍然有效,您可以为自己的委托选择自己的参数
-
@EpicKip:抱歉,我误解了您的评论,并认为您的意思是您可以对事件使用非委托类型。