码迷,mamicode.com
首页 > 其他好文 > 详细

delegate-委托

时间:2015-03-15 23:04:26      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:委托

      初识委托,是在第一次接触设计模式。大化设计模式362页,有一个对委托的简单介绍。那时候看完之后,脑袋里唯一遗留就只剩下委托二字了。我学了,我忘了。
     

      设计模式里的蔡老师说过:委托是对函数的封装,可以当作给方法的特征指定一个名称。委托是一种引用方法的类型。一旦为委托分配了方式,委托将于该方法具有完全相同的行为。


那么,究竟什么是委托?

           委托是我们自己定义的一种数据类型,跟类是并列关系。委托在C#是类型安全的。
    
         首先,我们为什么要要用委托呢?请看下面一段代码:
namespace 委托_赵亚盟
{
    class Program
    {
        static void Main(string[] args)
        {
        }
        /// <summary>
        /// 把字符串数组string[]中所有字符串转换成小写
        /// </summary>
        /// <param name="arg"></param>
        static void StringProcess1(string[] array)
        {
            for (int i = 0; i < array.Length; i++)
            {
                array[i] = array[i].ToLower();
            }
        }
        /// <summary>
        /// 把字符串数组string[]中所有字符串转换成大写
        /// </summary>
        /// <param name="arg"></param>
        static void StringProcess2(string[] array)
        {
            for (int i = 0; i < array.Length; i++)
            {
                array[i] = array[i].ToUpper();
            }
        }
        /// <summary>
        /// 把字符串数组string[]中所有字符串前后都加上双引号
        /// </summary>
        /// <param name="arg"></param>
        static void StringProcess3(string[] array)
        {
            for (int i = 0; i < array.Length; i++)
            {
                array[i] = "\"" + array[i] + "\""; 
            }
        }
    }
}
        以上三个不同的方法的有大量重复代码,使得我们的工作量变大。所以:我们要删除重复代码。我们把后两个方法删除,更改第一个方法,在一个方法里增加一个参数。我们想传过来一个方法,但是没法传。为什么呢?方法没法传到另一个方法中,方法本身是不能传递的。
      延伸:我们想要传递方法,所以引入了委托。因为方法不能作为方法的参数
      所以委托可以让我们把一个方法传递给另一个方法或者类。
      注意:C#中的委托必须指向相同签名方法      签名:(具有相同的参数列表和返回值类型)

委托的使用:

1、定义一种委托类型
2、委托执行时要调用方法
3、定义一个委托实例
4、委托实例的调用


下面我们写两个方法:并且定义一个委托:
namespace 委托_赵亚盟
{
    class Program
    {
        //声明了一个委托类型 引用类型
        delegate void delSayHi(string name);
        static void Main(string[] args)
        {
            ///定义委托对象(类似new)
            //方法一: 
            //delSayHi sayhi = new delSayHi(SayHiEnglish);
            //方法二:
            //delSayHi sayhi = SayHiEnglish;
            //调用
            //sayhi("赵亚盟");
            //方法一:Test(new delSayHi(SayHiEnglish), "赵亚盟");
            ///方法二:简写(因为编译器帮我们new了,所以我们可以直接将方法名传过去)
            Test(SayHiEnglish, "赵亚盟");
            Console.Read();
        }
        /// <summary>
        /// 测试方法
        /// </summary>
        /// <param name="del"></param>
        /// <param name="name"></param>
        static void Test(delSayHi del, string name)
        {
            del(name);
        }
        /// <summary>
        /// 说英文Hello的方法
        /// </summary>
        /// <param name="name"></param>
        static void SayHiEnglish(string name)
        {
            Console.WriteLine("Hello" + name);
        }
        /// <summary>
        /// 说中文你好的方法
        /// </summary>
        /// <param name="name"></param>
        static void SayHiChinese(string name)
        {
            Console.WriteLine("你好" + name);
        }
}
技术分享
会用委托了,那么委托给我们究竟带来了什么好处呢?那就看下面的小例子吧。
namespace 使用委托的好处_例子_赵亚盟
{
    class Program
    {  
        //声明了一个委托类型 引用类型    
        delegate string DelStringProcess(string s);
        
        static void Main(string[] args)
        {
            string[] array = { "aaa", "bbb", "ccc" };
            StringProcess(array, ToUpper);
            for (int i = 0; i < array.Length; i++)
            {
                Console.WriteLine(array[i]);
            }
            Console.Read();
        }
        /// <summary>
        /// 转换成大写
        /// </summary>
        /// <param name="s"></param>
        /// <returns></returns>
        static string ToUpper(string s)
        {
            return s.ToUpper();
        }
        /// <summary>
        /// 处理字符串数组
        /// </summary>
        /// <param name="array">要处理的数组</param>
        /// <param name="del">处理的方式(通过委托 传递一个方法,此方法处理字符串)</param>
        static void StringProcess(string[] array,DelStringProcess del)
        {
            for (int i = 0; i < array.Length; i++)
            {
                array[i] = del(array[i]);                          //通过委托去调用方法
            }
        }
    }
}
技术分享

通过以上实例可以看出:委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。
      
所以:使用委托可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。



delegate-委托

标签:委托

原文地址:http://blog.csdn.net/u010785685/article/details/44277721

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!