【C#】委托

版权声明:我的博客我做主! https://blog.csdn.net/lk1822791193/article/details/81505203

                              

委托

什么是委托,或者它是用来干什么的?

通俗解释:用来方法的传递,同等级类直接的方法的使用。因为c#中没用指针,但是如果想跨类传递一个方法怎么办,委托就出来了。

(它主要用于方法的回调和事件的实现。)

声明:

它使用Deletgate声明(所有委托的父类都是System.Delegate)

普通委托

场景:A类很优秀,B也想像A一样优秀,所以通过委托,表达一下自己内心的想法

    class Program
    {
        public delegate void  DG(string name);
        static void Main(string[] args)
        {
            B b =new B();
            b.name="凉快";
            
            DG dg;
            dg = new DG(A.Speak);
            dg(b.name);
            Console.ReadKey();
        }
    }    

    public class A
    {
        public static void Show(string name)
        {
            Console.WriteLine("我叫"+name+",我很优秀" );            
        }
    }

    public class B
    {
        public string name;
    }

输出结果:

    我叫凉快,我很优秀

多播

委托对象可使用 "+" 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。"-" 运算符可用于从合并的委托中移除组件委托。

委托的多播说白了,就是一个委托传递了多个方法!

场景:

A不仅很优秀,而且很勤奋,但是B也想很勤奋,怎么办再找一下委托吧!

    class Program
    {
        public delegate void  DG(string name);
        static void Main(string[] args)
        {
            B b =new B();//实例化B
            b.name="凉快";
            
            A a =newA();//实例化A


            DG dg;  //初始化委托

            dg = new DG(A.Show);     

            dg +=new DG(a.Speak);//委托一次
            dg(b.name);
            Console.ReadKey();
        }
    }    

    public class A
    {
        public static void Show(string name)  //静态方法
        {
            Console.WriteLine("我叫"+name+",我很优秀" );            
        }
        public void Speak(string name)    //非静态方法
        {
            Console.WriteLine("我叫"+ name+",我很勤奋");
        }

    }

    public class B
    {
        public string name;
    }

输出结果:

     我叫凉快,我很优秀
     我叫凉快,我很勤奋    

 

注意:

  1. 委托在申明的时候,返回值类型和参数类型一定要和传递的方法一致。
  2. 大家可以把委托是一个类,但是一个传递方法的类。
  3. 定义一个委托相当于定义一个新类,所有可以定义类的地方都可以定义委托。

 

优点

  1. 函数指针只能指向静态函数,而委托既可以引用静态函数,又可以引用非静态成员函数(从上边的第二个例子可以看出)。在引用非静态成员函数时,委托不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。
  2. 与函数指针相比,委托是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法,无须担心delegate会指向无效地址或者越界地址。

猜你喜欢

转载自blog.csdn.net/lk1822791193/article/details/81505203