gpt4 book ai didi

c# - 让事件符合 Net 指南有什么好处?

转载 作者:太空狗 更新时间:2023-10-29 19:50:33 24 4
gpt4 key购买 nike

我了解如何根据 Net Framework 指南使用事件,但使用这种模式有什么好处?

http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx :

The .NET Framework guidelines indicate that the delegate type used for an event should take two parameters, an "object source" parameter indicating the source of the event, and an "e" parameter that encapsulates any additional information about the event. The type of the "e" parameter should derive from the EventArgs class. For events that do not use any additional information, the .NET Framework has already defined an appropriate delegate type: EventHandler.

a) 我看到使用“对象源”值作为第一个参数的一些好处,因为在某些情况下多个对象可以将它们的事件设置为相同的方法。因此,例如,如果我们有 10 个对象,并且如果所有 10 个对象都将它们的事件设置为事件处理程序 M,那么在 M 内部我们可以使用“对象发送者”参数值来标识事件调用的发起者。

  • 但据我所知,“对象源”参数只有在实例方法内部引发事件时才有用。因此,如果事件是在静态方法内部引发的,那么“对象源”参数就没有用了?!

b) 根据 Net Framework 指南使用事件还有其他好处吗?

c) 无论好处是什么,为什么他们会超过不得不这样做的麻烦

  • 编写额外的代码,将所需的参数放入从 EventArgs 派生的对象中
  • 在事件处理程序中编写额外的代码以从 EventArgs 派生的对象中提取信息?

谢谢

最佳答案

据我所知,它有两个主要好处:

  • 编写使用该事件的代码的人将识别该模式并立即知道如何使用该事件
  • 事件的签名以能够适应变化的方式精心设计

第一点应该很明显,不需要太多阐述。

关于第二点,有两个原因(我认为)。首先,由于发送者是object,事件签名可以被多种类型重用。其次,由于第二个参数是 EventArgs 后代,当您引入自己的 EventArgs 类时,以后可以在不改变事件签名的情况下扩展该类。

更新
问题回复:

I’m not sure what you mean by “ being able to extend EventArgs without altering the signature of the event”?!

我们举个例子,拿下面这个类:

public class SomeClass
{
public event EventHandler<FileEventArgs> SomethingHappened;
}
public class FileEventArgs : EventArgs
{
public FileEventArgs(string filename)
{
Filename = filename;
}
public string Filename { get; private set; }
}

然后我们有一个监听 SomethingHappened 事件的消费者:

static void SomethingHappenedHandler(object sender, FileEventArgs e)
{
// do something intelligent
}

现在,假设我们想用关于文件发生了什么的信息来扩展我们在事件中传输的信息:

public enum WhatHappened
{
Copy,
Rename,
Delete
}
public class FileEventArgs : EventArgs
{
public FileEventArgs(string filename, WhatHappened whatHappened)
{
Filename = filename;
WhatHappened = whatHappened;
}
public string Filename { get; private set; }
public WhatHappened WhatHappened { get; private set; }
}

现在,如果我们选择将文件名作为事件本身的参数发送,我们将需要通过添加另一个参数来更改事件签名,从而有效地破坏所有监听事件的代码。但是由于我们在上面的代码中只是简单地向 FileEventArgs 类添加了另一个属性,因此签名保持不变,并且不需要更新监听器(除非他们想使用新添加的属性,即).

Am I write in assuming that if event is raised inside static method, then “object source” parameter is of no use?!

是的,没错。我通常将 null 作为 static 事件的 sender 参数传递(老实说,这种情况非常罕见)。

关于c# - 让事件符合 Net 指南有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2283073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com