c# 委托

        委托是一种数据类型,像类一样(可以声明委托类型变量),委托是安全封装方法的类型,类似于 C 和 C++ 中的函数指针。与 C 函数指针不同的是,委托是面向对象的、类型安全的和可靠的它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

        委托可以看做是函数的指针。整数可以用整数变量指向它,对象可以用对象变量指向它,函数也可以用委托变量指向它。和直接调用函数的区别:用委托就可以指向任意的函数,哪怕是之前没定义的都可以,而不使用受限于那几种。

1.委托是一种数据类型,像类一样的一种数据类型。一般都是直接在命名空间中定义。

2.定义委托时,需要指明返回值类型、委托名与参数列表.这样就能确定该类型的委托能存储什么样的方法。

3.使用委托:

    3.1声明委托变量。

    3.2委托是一个引用类型,就像类一样,所以当声明委托变量后,如果不赋值则该委托变量为null。所以在使用委托变量前最好做非空校验weituo!=null

    3.3委托类型的变量只能赋值一个委托类型的对象。

委托的使用:

第一种写法:
namespace 委托
{
    //声明一个委托指向一个函数
    public delegate void DelSayHi(string name);
    class Program
    {
        static void Main(string[] args)
        {
            //DelSayHi del = new DelSayHi(SayHiEnglish);
            //将制定的函数传入到委托中
            DelSayHi del = new DelSayHi(SayHiChinese);
           //或者可以这样写:DelSayHi del = SayHiEnglish;可直接把函数赋值给委托,实际上还是调用了new方法。
            del("张三");
            Console.ReadKey();
        }
        public static void SayHiChinese(string name)
        {
            Console.WriteLine("吃了吗?" + name);
        }
        public static void SayHiEnglish(string name)
        {
            Console.WriteLine("Nice to meet you" + name);
        }
    }
}

第二种写法:
namespace 委托
{
    //声明一个委托指向一个函数
    public delegate void DelSayHi(string name);
    class Program
    {
        static void Main(string[] args)
        {
            Test("张三", SayHiEnglish);
            Console.ReadKey();
        }
        public static void Test(string name, DelSayHi del)
        {
            del(name);
        }
        public static void SayHiChinese(string name)
        {
            Console.WriteLine("吃了吗?" + name);
        }
        public static void SayHiEnglish(string name)
        {
            Console.WriteLine("Nice to meet you" + name);
        }
    }
}
第三种写法:委托加匿名函数
匿名方法:不能在类中定义,而是在给委托变量赋值的时候,需要赋值一个方法,此时可以“现做现卖”,定义一个匿名方法传递给该委托。
namespace 匿名函数
{
    //第一步:先声明一个委托
    public delegate void DelSayHi(string name);
    class Program
    {
        static void Main(string[] args)
        {
            //第二步:把匿名函数赋值给委托
            DelSayHi del = delegate(string name)
            {
                Console.WriteLine("nice to meet you" + name);
            };
            del("张三");
            Console.ReadKey();
        }
    }
}
第四种方法:委托加lamda表达式:比匿名函数更方便(不需要传数据类型,因为委托已经限定了数据类型)
namespace _lamda表达式
{
    public delegate void DelSayHi(string name);
    class Program
    {
        static void Main(string[] args)
        {
            DelSayHi del = (string name) => { Console.WriteLine("你好" + name); };//等价于DelSayHi del = name => { Console.WriteLine("你好" + name); }
            del("张三");
            Console.ReadKey();
        }
    }
}

 

posted on 2018-06-02 17:59  琪琪伤感  阅读(206)  评论(0编辑  收藏  举报