|
用户名:doitnow 笔名:doitnow 地区: |
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
套
今天我和MM的短信聊天:
MM:你在干吗呢?
me:我在看央视的禁赌片,触目惊心。
(当时的确在和宿舍的哥们一起看央视做的禁赌的宣传片,宣传的效果不错,觉得无论如何不能沾赌)
MM:重要自己洁身自好就行,你会赌博吗?
me:会,必要的时候玩下。
(心想,我肯定不会的了,但逗她玩下,看她什么反应)
MM:你酒量如何?
me:只要能喝过你就行了。
(纳闷,她干吗问这个?女人嘛,可能就喜欢问无聊的问题,那我就继续调侃了)
MM:有美女从身旁经过,你会有什么反应?
me:欣赏一下吧!
(本来想说,看都不看,心里面只有你。但又觉得太假,并且又不知道她卖的什么药,就说的很心虚的回答了下,看她下步的反应,以采取行动)
MM:难道不会想入非非?
me:当然会有点了。。。
(
,晕了,怎么问这个,继续壮胆,以探究竟。其实,实在话,本人看到美女多时欣赏,非分之想的情况很好,纳闷,这样应该没有问题吧)
MM:好了,吃喝嫖赌具全,不失男人本色!
me:
(女人,挺有意思的,但更多的时候我们还是尽量的少思考一点)
c#中的delegate
学习c#都会惊奇于它的delegate,其实delegate并没有太多神秘的地方,说的通俗点,delegate是类型化了的函数指针,它主要应用于回调。
学习c++的对函数指针都不回陌生,它是一个保存了函数地址的变量,但除了地址,它没有包含任何额外的信息,如参数的个数、参数类型和函数的返回地址等,所以函数指针是非类型安全的。而delegate对回调提供了类型的安全性,从而使我们在处理回调等问题的时候可以更加优美的面向对象的方式来编写代码,并且在CLR的内部对delegate的操作提供了许多支持(如delegate链表),简化了我们常用的操作。
在使用delegate的过程中,首先要定义一个delegate的类型,如:
public delegate void SomeFunction(Object a,int i,...);
note:它是一个类的定义,可以放在任何地方,此类型定义了此delegate所接收的函数的样式:返回void,参数列表...
然后,为了使用,要定义类SomeFunction的一个实例:
public SomeFunction instance;
接着,我们就可以往这个delegate实例中放“符合规范”的函数(可以为实例函数和静态函数)。
instance +=new SomeFunction(someObject.SomeMethod);
其中someObject为某类的一个实例,它的方面SomeMethod符合此委托的规范要求,否则将编译报错。
最后,可以直接调用instance实例来实现对someObject的SomeMethod的回调。
instance(...);
##########################
只是从上面的实现中,貌似看不出delegate真正存在的价值,但实际上delegate增加了对链的支持,我们可以象下面这样应用:
instance +=new SomeFunction(someObject.SomeMethod);
instance +=new SomeFunction(anotherObject.anotherMethod);
...
然后调用instance(...),可以同时激发所有注册自里面的回调函数。
这是怎样实现的,首先要研究delegate内在的结构,在每个delegate里面包括了三个字段:
target ——》指向回调函数所属的对象实例(对于实例方法来言)
method ——》指向回调函数
prev ——》指向另外一个delegate 实例
通过prev就可以比较方便的实现delegate对链的支持。
CLR定义了Delegate.Combine和Delegate.Remove静态方法实现对链表的操作。
天好蓝
天好蓝,阳光暖暖的照在脸上,幸福原来如此简单!
2005年有如此温馨的开始,相信一切都会不同,重拾你的骄傲,让新一年的阳光把它照的闪闪发光。
昨晚在很郁闷之际,一个朋友发给了我一条这样的短信,看后,内心深处有了一点微微的震撼。细忖,生活的确如此,大部分的烦恼都是可以被一两句话而击的无影无踪。