|
|
|
|
使用.NET事件设计模式 虽然如你在Visual Basic 6.0和我前面的例子中所可能做的一样引发事件并没有什么错误,.NET Framework已经为事件采用了一种特别的设计模式,一种你应该在你的应用程序中采用的设计模式。在这个模式里,所有事件提供两个参数:一个对象,提供一个对引发事件(一般命名为sender)对象的引用,和一个EventArgs对象(或者一个继承于EventArgs的对象),提供相关信息给事件(一般命名为e)。 标准.NET Framework事件的设计模式添加了三个建议。首先,如果你的事件需要传递任何信息到它的侦听器,你应该创建一个继承于EventArgs的类并且它包含附加信息。你可以使用你的类的构造器来接受并存储信息。在示例项目中,FileFoundEventArgs类如图 8 所示。 第二,提供一个引发事件的过程。大多.NET Framework类从一个重载的protected过程引发事件,一般命名为OnEventName(在FileFound事件的情况下,过程会被命名为OnFileFound)。需要引发事件的代码调用OnEventName过程,它将接着引发事件。使之成为一个protected方法意味着它可为当前类型的对象所用和基于继承自当前类的任何对象所用。使之重载意味着继承类可以改变事件的行为: 一个继承类可以添加运行于调用基类的OnEventName过程之前或之后的代码,或者可以全部跳过它们。在这个示例项目中,FileSearch5类提供以下protected过程: ’ From FileFoundEventsArgs.vb’’ 来自 FileSearch9.vb这个过程用RaiseEvent语句的第一个参数传递关键词Me。这个关键词引用在当前运行的代码中的对象,它当然就是那个引发事件的对象。 第三,你可能发现创建你自己的事件委托是很有用的。尽管你无须定义一个显式事件委托就可获得事件委托,但在自己创建时可获得一些灵活性。在你创建一个委托时,你正在为过程定义一个“类型”。如果你有不止一个事件,它们需要同一套参数,创建一个定义这个类型的委托将会有用。如果你需要修改这些参数,你可以只要修改委托,而不用修改事件声明。 举个例子,你可以声明这个FileFound事件,不用事件委托,如下: Public Event FileFound( _如果你这时想要声明其他事件,使用相同参数,你将必须重复整个声明: Public Event FileFoundSomeOtherEvent( _作为选择,你也可以声明一个新的委托类型,它描述了你的事件的参数签名: Public Delegate Sub FileFoundEventHandler( _这时你应该声明这个类型的声明事件: Public Event FileFound As FileFoundEventHandler如果你没有采取这个额外的步骤,Visual Basic .NET编译器将为你做这些工作,添加新的委托类型到类的元数据中去。FileSearch5.Search方法利用了这一机制,在每个文件找到时调用OnFileFound方法: ’’ 来自 FileSearch5.vb点击示例窗体上的Event Design Pattern按钮创建一个FileSearch5类的实例并调用它的Execute方法(正如所有前面的例子一样)。在此情况下,FileSearch5.FileFound事件的事件处理程序是有点不同:不是只接受一个FileInfo对象,这个事件处理程序看起来像一个标准的.NET事件处理程序;它接受两个参数并使用了FileFoundEventArgs参数的 FileFound属性来显示找到的文件名称: ’’ From frmMain.vb尽管你不需要使用标准.NET事件处理设计模式,它总是使得你自己的事件与内部.NET对象引发的事件匹配的最好。你获得在你的事件侦听器中“通晓”的好处,并且它们看起来像其他事件。创建你自己的事件委托是可选的,但是如果你有多个事件传递相同的参数,使用事件委托可以简化你的代码。另外,因为事件参数的更改只能在一个地方进行,所以根据你的需要在任何时候修改你的代码将会更容易。 |

