c# - 委托(delegate)与事件

标签 c# .net vb.net events delegates

当一个类不能(或不应该)做某事时,事件或委托(delegate)可能是一种解决方案。

class President
  Event AskedQuestion(QuestionEventArgs)
  Delegate GetAnswerToQuestion

class Scientist
  AnswerToQuestion()

// delegate approach
myPresident.GetAnswerToQuestion = AddressOf myScientist.AnswerToQuestion
// called once myPresident need it

// event approach
myScientist.AnswerToQuestion(questionEventArgs) Handles President.AskedQuestion
{ 
   // executed once president asked a question
}

在委托(delegate)方法中,Scientist 方法直接由总统类使用,如果一位总统提出问题,Scientist 会给出答案。

在 .NET Framework 代码中我没有观察到委托(delegate)的直接使用。直接使用它是否错误,如果错误,为什么?

最佳答案

Is it wrong to use it directly, and if, why?

不,这没有错。

这是我的看法。委托(delegate)字段之于事件就像字符串字段之于属性。也就是说,您可能有:

class Car
{
    private string modelName;
    public string ModelName { get { return this.modelName; } }
    ...

模型名称​​逻辑上是汽车的属性。当有人问你开的是什么车,你说“福特福克斯”时,你是在描述这辆车的属性。你不会把“福特福克斯”当成一个“田”或“弦”,你会把它当成一种汽车的名字。在计算机程序中,字符串字段只是名称存储方式的实现细节。该属性可以是一个字符串,也可以是一个枚举,或者其他任何东西;关键是,从逻辑上讲,汽车有型号名称,而不是字符串字段。

事件和委托(delegate)是一样的。汽车可以有一个“爆炸”事件(也许你正在编写一个视频游戏!)并且爆炸事件由委托(delegate)类型的字段实现。爆炸是汽车合乎逻辑的事情;委托(delegate)字段是实现事件的机制。

那么直接使用委托(delegate)是“错误”的吗?不,当然不是。无非直接使用字符串是“错误”的。有时您需要操作不是属性的字符串,有时您需要操作不是事件的委托(delegate)。

诀窍是编写清楚地将机械 流程与业务 流程分开的代码。如果您发现您将大量字符串逻辑与您的属性逻辑混合在一起,或者将大量委托(delegate)操作与您的事件混合在一起,那么您可能会考虑尝试将机制代码与业务代码分开一点,以便它更容易看出哪个是哪个。

关于c# - 委托(delegate)与事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6107757/

相关文章:

c# - 如何将时间和奥尔森时区转换为另一个奥尔森时区的时间?

c# - 如何让普通的 WebRequest 异步且可等待?

c# - 将大型项目从 VB.Net 迁移到 C# 的技巧?

.net - Visual Studio 2008 宏 : write to output pane

c# - 无法访问已处置的对象。对象名称 : 'System.Net.HttpListener'

.net - 开发/调试 Windows 服务的最简单方法

c# - Itext myImage.Alignment = Image.TEXTWRAP |图片.ALIGN_RIGHT; VB等效?

c# - 如何使用 C# 和 iTextSharp 在 pdf 中添加图像?

c# - 委托(delegate)上的 BeginInvoke 和 EndInvoke 是否都生成完整的栅栏?

.net - 犀牛模拟中的部分参数匹配