当一个类不能(或不应该)做某事时,事件或委托(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/