日期:2014-05-18  浏览次数:20905 次

何种情况下使用委托?
不管了MSDN上的例子 还是C#高级编程里的例子 都看了下...
感觉为什么一定要使用委托呢?正常的方式去调用类里另外一个方法不是一样么?
如果你要说可以多次new委托,达到复用?那么代码量没有减少,性能会有提升?

什么样的情况下我需要使用委托或者匿名方法?
拿eventhandler来说,我初步的理解它也就是一个参数是sender和e的方法
比如我这样的代码:
C# code

        public void Init(HttpApplication application)
        {
            application.BeginRequest += (new EventHandler(this.Application_BeginRequest));
            application.EndRequest += (new EventHandler(this.Application_EndRequest));
        }

        // Your BeginRequest event handler.
        private void Application_BeginRequest(Object source, EventArgs e)
        {
            //do something;
        }

        // Your EndRequest event handler.
        private void Application_EndRequest(Object source, EventArgs e)
        {
            //do something;
        }



我完全可以不那样写啊,我简单的写成如下形式不一样的意思吗?
C# code

        public void Init(HttpApplication application)
        {
            application.BeginRequest += Application_BeginRequest();
            application.EndRequest += Application_EndRequest();
        }

        // Your BeginRequest event handler.
        private void Application_BeginRequest(Object source, EventArgs e)
        {
            //do something;
        }

        // Your EndRequest event handler.
        private void Application_EndRequest(Object source, EventArgs e)
        {
            //do something;
        }



上面的代码只是说明一下我的意思,不要深究里面的错误...我的意思就是说我完全可以在Init事件里去掉我要用的方法,而不使用委托。。。
所以回到这个问题
什么样的情况下我需要使用委托或者匿名方法?

------解决方案--------------------
引用楼主 mmbf001 的帖子:
我的意思就是说我完全可以在Init事件里去掉我要用的方法,而不使用委托。。。

------解决方案--------------------
嗯,事实是很多时候,你要使用的方法并不确定
抄袭某位前辈的代码
假设有和欢迎的函数,你想使它在中国用户使用的时候用中文问好,在老外使用的时候用E文问好

 如果不使用委托,你要编写两个函数
 
static void welcome()
{
welcomeInChinese();

或者
static void welcome()
{
welcomeInEnglish();
}


static void welcomeInChinese()
{
Console.WriteLine("欢迎您的使用");
  
  
}
static void welcomeInEnglish()
{
Console.writeLine("Welcome to use!");
}

嗯,如果这样的话,你的代码的适应性就很差,至于为什么··请看下面
 
假如我们定义一个委托
delegate void myDel(); //委托是一个类,委托的变量是方法.

修改前面的欢迎函数定义 

static void welcome(myDel a )
{
a();
}

当遇见老外的时候,就把 welcomeInEnglish 这个变量(额,就当他是变量吧)传给a,如果是中国人,就传
welcomeInChinese .

这样代码的适应性就很强了。
至于为什么?
很简单,假如你不使用委托,你如何实现动态的调用不同的函数来服务不同的客户? 除了直接修改代码,你还能做什么?
用了委托,你就可以动态的调用函数,而不需要去修改代码了
用个if就行
if(中国客户)
{
welcome(welcomeInChinese) ;//委托变量存储的是方法

}
else
{
welcome(welcomeInEnglish);
}
 
 
------解决方案--------------------
看来你完全没有理解委托...你的第二种写法只是Lambda的语法糖,叫做匿名委托...还是委托,换汤不换药...

委托是给其他调用者使用的,它的最大特点是调用者不知道什么时候该调用它,所以只好提前订阅它然后做自己的事不去管它...当委托对象有了订阅者感兴趣的消息就会通知调用者...这是方法不能很容易做到的...

想象一下订阅报纸或牛奶的过程...去看看Windows消息机制和事件驱动机制将有助于你理解委托...
------解决方案--------------------

------解决方案--------------------
似乎上面说的不够透彻(不用委托也能实现动态的调用哈),,用委托能带来很多好处,但个人水平也就那样了,等高手····
------解决方案--------------------