C# 事件与 Delphi 事件的比较

C#中的 事件就像在Delphi(或者我应该说 Object Pascal)中一样只是类的属性(properties)。事件是将调用委托给calling类的方法指针。

事件具有三个主要部分:

1. 方法指针属性(method pointer property)
2. 事件的触发
3. 事件处理程序(event handler)

public delegate void OnSomething(object Sender, int Value);

1. 方法指针属性。
Delphi 和 C# 有很多标准方法指针类型。最常见的 Delphi 方法指针类型是 TNotifyEvent。在 C#(或 .NET 框架)中,这是 System.EventHandler。
您可以使用这些方法,但您也可以制作自己的方法。

定义方法指针类型:
在 C# 中:

public delegate void OnSomething(object Sender, int Value);

在 .NET 中,您当然可以将参数存储在(派生的)System.EventArgs 对象中。

Delphi中:

TOnSomething = procedure (Sender : TObject; Value : Integer) of Object;

 它们只是使用它们的对象必须可用的类型。

想要引发事件的类必须有一个公共属性:
在 C# 中:

public event OnSomething BeforeSomething;

 delphi中:

property BeforeSomething : TOnSomething read FBeforeSomething write BeforeSomething;
(Where FBeforeSomething is a private field of the same type)

 2.触事件

在此示例中,触发 BeforeSomething 事件。如果调用类已将属性分配给(事件)类,则该类可以触发它。

在 C# 中:

public virtual void LetItHappen()
{
    // 类应该为事件添加一个有效的整数值,这里是 10
   if (OnSomething!= null ) 
      OnSomething(this, 10);
}

In Delphi:

procedure TSomeClass.LetItHappen;
begin
   if Assigned(FOnSomething) then 
      FOnSomething(Self, 10);
end;

您必须检查该属性是否已分配,否则您将收到访问冲突。 C# 和 Delphi 的代码惊人地相似。如果你愿意,你可以让它更相似:

private bool Assigned(object AObject)
{
  if (AObject != null)
    return true;
  else
    return false;
}

the C# code then could be:

if Assigned(OnSomething) 
   OnSomething(this, 10);

3. The eventhandler

在能调用对象中,您应该首先创建一个事件处理程序方法: (假设能调用是 SomeObject : TSomeClass)

In C#:

private void MyBeforeSomething(object Sender, int Value)
{
   MessageBox.Show(Value.ToString());
}

In Delphi:

procedure TSomeClass.MyBeforeSomething(Sender : TObject; Value :
Integer);
begin
   ShowMessage(IntToStr(Value);
end;

您现在应该做的最后一件事是分配属性:

In C#:

SomeObject.BeforeSomething += new OnSomething(MyBeforeSomething);

In Delphi:

SomeObject.BeforeSomething := MyBeforeSometing;

一个完整的delphi示例如下:

program MQTest;

 {$APPTYPE CONSOLE}
 type
   { Define a procedural type }
   TPingEvent = procedure of object;

   { The observed object }
   TObservedObject = class
   private
     FPing: TPingEvent;

   public
     property OnPing: TPingEvent read FPing write FPing;

     { Triggers the event if anything is registered }
     procedure TriggerEvent();
   end;

   { The listener }
   TListener = class
     procedure Ping;
   end;


 procedure TObservedObject.TriggerEvent;
 begin
   { Call the registerd event only if there is a listener }
   if Assigned(FPing) then
     FPing();
 end;

 procedure TListener.Ping;
 begin
   Writeln('TListener has been pinged.');
 end;

 var
   ObservedObject: TObservedObject;
   Listener: TListener;

 begin
   { Create object instances }
   ObservedObject := TObservedObject.Create();
   Listener := TListener.Create();

   { Register the event handler }
   ObservedObject.OnPing := Listener.Ping;

   { Trigger the event }
   ObservedObject.TriggerEvent();//Should output 'TListener has been pinged'
   Readln;                       // Pause console before closing
 end.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值