匿名委托之实现单件窗体

javascript中可以实现匿名方法如下:
obj.onclick  =   function (){
 ..
}

这样写法不仅结构紧凑,而且实现代码生成也相当方便。
最近注意到C#中有类似的匿名委托同样伟大。
起源如下:
我要在一个窗体中弹出另外一些窗体,而我又不想用单件模式去改造这些弹出窗体,最终用了以下做法:
public   partial   class  frmMain : Form
{
 
private Form fmDynamic;

 
//MenuItem Click
 private void tmfDynamic_Click(object sender, EventArgs e)
        
{
            
if (fmDynamic == null)
            
{
                fmDynamic 
= new frmDynamic();
                fmDynamic.Show();
                fmDynamic.FormClosed 
+= new FormClosedEventHandler(delegate(object s, FormClosedEventArgs ev)
                    
{
                        fmDynamic 
= null
;
                    }
);
            }

            
else
            
{
                fmDynamic.Focus();
            }

        }

}


       这种单件窗体的实现关键在于,弹出窗体在关闭时要通知Opener更新,也就是为其注册关闭事件的委托。
本来注册委托普通的写法是fmDynamic.FormClosed += new FormClosedEventHandler(委托名);而匿名委托
的写法是将委托名换成了其所指向的方法体。

       这很好理解,委托就是指向方法的指针,所以可以使得方法作为参数被其他方法调用。但是为什么方法体也可以被作为参数呢?可以这样理解:int.Parse("3"); 和 string sValue="3";int.Parse(sValue); 逻辑和执行效果上等价的。把方法体作为参数就类似于传"3"这种直接参数;把委托名作为参数就类似于把sValue这种间接引用作为参数。

       匿名委托的好处在为动态生成的控件注册事件时更显而易见:为窗体动态添加方法要付出多大的代价?现在好了,可以在生成控件的方法中直接注册。另外也可以很方便地引用局部变量,使得代码结构紧凑。

 

/* 整理自 2007.09.XX  技术点应用记录 */
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值