塞伯坦

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
     谈到事件要先说说委托!什么是委托?其实我也不能讲它说的很明确。尽量的解释一下。
     我们如何定义方法?如何调用方法?先想想再继续下面的内容。 
class Test
{
   
static void Main()
   
{
      
string msg = "message";
      MethodName(msg);
   }

   
static void MethodName(string msg)
   
{
     
//代码
   }

}

     委托是一种引用方法的类型。委托定义出它想要代表的方法的原型,然后它可以和任何符合它所定义的方法的原型相关联。但使用委托时就犹如你在调用一个方法。看看委托如何被定义、实例化和使用的。
   
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    
/// <summary>
    
/// 定义一个委托。委托和类一样都是一种类型。只是委托所代表的是一种被定义好原型的方法。
    
/// </summary>

    delegate void Mydeleg(string msg);
    
class Program
    
{
        
static void Main(string[] args)
        
{
            
//实例化一个委托,也可以看成将一个委托和一个实际想要调用的方法关联起来。
            
//其中new Mydeleg(GetMessage) 中的GetMessage是定义个方法的实例。你也可以将GetMessage换成GetMessage2
            
//原因稍后将要进一步的讲解。
            Mydeleg methodRef = new Mydeleg(GetMessage);
            methodRef(
"The first message!");
            Console.Read();
        }

        
static void GetMessage(string msgInfo)
        
{
            Console.WriteLine(msgInfo);
        }

        
static void GetMessage2(string msgInfo2)
        
{
            Console.WriteLine(msgInfo2);
        }

    }

    
class TestClass
    
{
        
public void GetMessage(string msg)
        
{
            Console.WriteLine(msg);
        }

    }

}

     通过委托的定义你会发现。定义一个委托就好像在定义个方法一样(形式上很类似)。你可以比较一下。
     定义一个委托:delegate 类型 委托名称(类型 参数名称, [类型 参数]) -- delegate void Mydeleg(string msg);
     定义一个方法:类型 方法名称(类型 参数名称, [类型 参数])-- void GetMessage(string msgInfo);
相似吗?是的。委托实际就是在定义它能够代表什么样的方法。如果这个方法符合委托所定义的方法“原型”我们就可以使用委托来调用那个方法。就是这样的。
    为什么需要使用委托呢?简单的为了调用一个方法吗(也许就是这么简单)?我认为不仅仅这样。如果你运行以上的方法你会发现你真的能够去调用一个方法并且不用知道这个方法到底是什么方法名。方法到底是什么?本质上说我认为方法不过是执行一段代码而已(不是吗?),可是方法一旦确定后就必须使用方法名来调用它。委托却不需要这样做。看看下面的例子吧
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    
/// <summary>
    
/// 定义一个委托。委托和类一样都是一种类型。只是委托所代表的是一种被定义好原型的方法。
    
/// </summary>

    public delegate void Mydeleg(string msg);
    
/// <summary>
    
/// 假设这是一能够发送信息的类。我们可以通过这个类处理管理"信息的各种处理“。
    
/// </summary>

    class Message
    
{
        
public Mydeleg deleg;
        
public void Send(string message)
        
{
            
//表示我在发送信息前对信息做一定的加工。
            string result = "you have a message : " + message;
            
//然后我们需要将这个信息发送。现在我在想一件事情。我要将信息怎么发送?发送到哪?
            
//发生信息到手机, 那你需要在这里编写发送到手机上的代码逻辑
            
//发送信息到邮箱, 那你需要在这里编写发送到邮箱上的代码逻辑
            
//发送信息到QQ上,  那你需要在这里编写发送到QQ上的代码逻辑
            
//或发送信息到手机并且邮箱、QQ中,又是相应的逻辑。
            
//我还能列举很多。你现在要解决的问题是如果在不改变这个类的前提下你如何将信息发送到客户需要发送的地方。
            
//我的想法是,使用委托。
            if (deleg != null)
                
//调用这句你将发现实际是将外部定义的方法引用到这里。使你的方法拥有了在外部定义发送逻辑的能力。
                deleg(message);
        }

    }

}

     下面展现了如果将外部的方法引用到Send方法内部来执行的能力。

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            
//实例化message对象
            Message message = new Message();
            
//设置message对象中的委托类型的成员变量。
            message.deleg = new Mydeleg(SendMobilePhone);
            
//当调用这句的时候实际上在Send方法中附加了底下SendMobilePhone中包含的逻辑(发送方式的逻辑)。
            message.Send("I love you");
            Console.Read();
        }

        
static void SendMobilePhone(string msg)
        
{
            
//表示发送到手机上的逻辑。
            Console.WriteLine( msg + " send to MobilePhone");
        }

    }

 
}

源代码:为什么使用委托
所以我认为委托是你动态的调用方法变成可能。而动态调用方法的意义就在于你可以在任意的地方插入任意的代码,灵活度大大提高。
posted on 2007-09-21 00:57  蔡鹏  阅读(868)  评论(11编辑  收藏  举报