在 VB6 中,ActiveX 组件中创建的事件是这样声明的:
公共事件处理完成()
并调用该 ActiveX 组件,如:
引发事件处理完成
我正在创建一个我想要做同样事情的托管 C++ DLL。它看起来不像代表正是我想要的。我认为更合适的项目是 __event 声明。帮助?!?
最后,我有一个 C# 应用程序,我想拥有这样的功能:
MyObject::ProcessingComplete() <--- 这是发生“RaiseEvent”时调用的函数。{
}
谢谢。
听起来你确实想要一个活动。在 .NET 中,事件只是一个按照约定具有特殊签名的委托。这是在类中声明事件的 C# 示例:
public class MyObject
{
// ...
public event EventHandler ProcessingComplete;
// ...
}
EventHandler 是一个带有两个参数的委托:
public delegate EventHandler(object sender, EventArgs e);
发送者是引发事件的对象,EventArgs 对您想要传递给事件订阅者的任何信息进行编码。
每个事件都应该遵循这个约定。如果您希望为您的事件传达专门的信息,您可以创建自己的从 EventArgs 派生的类。.NET 为此目的定义了一个通用类型的 EventHandler 委托,EventHandler<TEventArgs>
. C# 示例:
class ProcessingCompleteEventArgs : EventArgs
{
public ProcessingCompleteEventArgs(int itemsProcessed)
{
this.ItemsProcessed = itemsProcessed;
}
public int ItemsProcessed
{
get;
private set;
}
}
// ...
// event declaration would look like this:
public event EventHandler<ProcessingCompleteEventArgs> ProcessingComplete;
要订阅事件,请使用+=
运算符。要取消订阅,请使用-=
运算符。
void Start()
{
this.o = new MyObject();
this.o.ProcessingComplete += new EventHandler(this.OnProcessingComplete);
// ...
}
void Stop()
{
this.o.ProcessingComplete -= new EventHandler(this.OnProcessingComplete);
}
void OnProcessingComplete(object sender, EventArgs e)
{
// ...
}
在您的类中,要触发事件,您可以使用正常语法来调用委托:
void Process()
{
// ...
// processing is done, get ready to fire the event
EventHandler processingComplete = this.ProcessingComplete;
// an event with no subscribers is null, so always check!
if (processingComplete != null)
{
processingComplete(this, EventArgs.Empty);
}
}
活动和代表。
总结:委托是一个可以持有对方法的引用的类。与其他类不同,委托类具有签名,并且它只能保存对与其签名匹配的方法的引用。
托管 C++ 中的事件:事件、WindowEvents 的问题
总结:.NET 编程包括委托和事件的概念,以促进观察者或发布/订阅设计模式。大多数时候,您使用事件的方式与多年来在标准 Win32 API 或 MFC 编程中使用回调函数的方式非常相似。
我想代表是要走的路。
public delegate void ProcessCompleteEventHandler(object sender, EventArgs e);
在课堂之外的某个地方定义上述内容。在你的班级里面
class MySampleClass{
public event ProcessCompleteEventHandler ProcessComplete;
void SomeWork()
{
//Do some work, and when its over...
ProcessComplete.Invoke(this, null);
}
}
在您的主程序中:
MySampleClass obj = new MySampleClass();
obj.ProcessComplete += new ProcessCompleteEventHandler(my_handler);
my_handler 应该有相同的签名...