java 委托 事务_事件与委托

事件是构建在委托上的,例如定义Button的Click事件:

public event EventHandler Click;

需要event关键字和EventHandler委托,EventHandler在这里的作用就好像接口,所有想接收事件通知的实例必须实现符合EventHandler参数定义和返回值定义的回调函数,.NET框架通过委托这种方式保证了回调函数类型的安全。

再来看委托的定义,以EventHandler为例:

public delegate void EventHandler(object sender, EventArgs e);

很像方法的定义,只是多了一个delegate关键字;不过它实际上是一个类,可以查看IL代码:

84a45e8f84ecdfce877d953a57ed54de.png . class public auto ansi serializable sealed EventHandler

a7eb5e2c13c3dc1b5ad8b43230286d4e.png extends System.MulticastDelegate

99b60b25db8da27e9d908e92a2b15373.png

6a4b2e67f3c65821362e6f8ce705ddeb.png

6825f62cdde160d56bbad7dd9b663b42.png {

8d2d7229c81dc251badb1ac6fb3f5790.png

9f377382f6672c05d63840e83e7b4dbd.png .custom instance void System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) =

d467b1fe5764a128d13c0fb7679a00c7.png{ bool(true) }

45f076065c96d6a11dca264d83d48114.png .method public hidebysig specialname rtspecialname instance void .ctor(object’object’, native int’method’) runtime managed

2c91e8b1657197e1e2122aab1265e2e7.png

3dc1910228442e6d193f972b2c9e1693.png

61eda65e43e5857113f80d0d8dcbaf84.png{

c67a419f065c6010501694bae457dc29.png }

aac697552c4cefa36ca91c63af4a04e4.png

8391d95af84280606fe09c9139693c44.png .method public hidebysig newslot virtual instance class System.IAsyncResult BeginInvoke(object sender, class System.EventArgs e, class System.AsyncCallback callback, object’object’) runtime managed

c3a47e3d35fc67bcccf0067b0ba7e7da.png

b5cf0b85526f301e77b17715ae6648e0.png

0fd8ba2eb33962ce0d776c26748c4d1a.png{

2c828e22a8c98ebdf3b16346df4c94fc.png }

92f402bac4a2fc41dd439291149b1515.png

df8b55b91d8ffbdc921496c06fb04117.png .method public hidebysig newslot virtual instance void EndInvoke(class System.IAsyncResult result) runtime managed

9408a0a349ece01fc3711a72180a61c9.png

7a90fb9e42f6bfa751fb059bd209ae04.png

8ea9f0d95cc74047a823ac4eb7678e4f.png{

cbe19ac482ec960ba9214d303f46cb39.png }

2b9b339f53e9ab3e0f0dd7a100c4c3cb.png

b74c807d3d7ae254736bae9171d32058.png .method public hidebysig newslot virtual instance void Invoke(object sender, class System.EventArgs e) runtime managed

85ece2117e2fc6a72d15534c149a23c7.png

b43eb7d8b650fc454a1eb26accf58620.png

dbe960f6ee39a289f7562184daedb7c2.png{

d80c0ad956e06a114b7188b03e4f99ed.png }

c7f5f2a420f732ec8ddf406e7f9e9880.png

64353920f746bdb7b4b724e03c8deda7.png}

0c5196a5dcb726ccaba799c3fa8ae913.png

2d9ce6857c90cdfccf62bda5c1f2f5a8.png

类中除了构造函数还有三个方法,构造函数接收接收两个参数,一个对象引用和一个指向回调函数的整数,在运行时,EventHandler通过Invoke方法找到对应对象的对应方法(也就是回调函数)执行具体操作。(EventHandler继承自System.MulticastDelegate,在李建忠译的框架程序设计那本书中说MulticastDelegate中含有一个_prev字段使委托可以构成链表实现多播,不过在.NET2.0中查看代码没有看到,也没有详细研究,不过这本书里把.NET1.1中的事件和委托讲的非常透彻,极力推荐)

https://www.cnblogs.com/end/category/82543.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值