版权声明:我的博客我做主! 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;
}
输出结果:
我叫凉快,我很优秀
我叫凉快,我很勤奋
注意:
- 委托在申明的时候,返回值类型和参数类型一定要和传递的方法一致。
- 大家可以把委托是一个类,但是一个传递方法的类。
- 定义一个委托相当于定义一个新类,所有可以定义类的地方都可以定义委托。
优点
- 函数指针只能指向静态函数,而委托既可以引用静态函数,又可以引用非静态成员函数(从上边的第二个例子可以看出)。在引用非静态成员函数时,委托不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。
- 与函数指针相比,委托是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法,无须担心delegate会指向无效地址或者越界地址。