C# 委托 (delegate)

委托

委托概念:

委托是引用类型,也可以自定义类型;

换个概念:A委托B去做一件事。站在A的角度,A委托了B,站在B的角度,B是A的代理。

C#语言中的委托比较抽象:委托指向一系列具有相同签名和返回类型的方法的地址。

总结:委托是一系列方法地址的引用,委托就代理了一系列的方法。调用委托就相当于调用这一系列方法。

委托定义:

使用delegate关键字

在类内部可以定义,在类外部也可以,在方法中不能定义

 internal class Program
 {
     //定义委托,观察一下:委托和方法的形式的区别:a.没有方法体 b.多个delegate关键字。
     //可以没有返回,可以没有参数。
     public delegate void SayHello();
     public delegate bool Delegate1(string arg);
}

调用/使用委托:   

方法:返回值类型 返回值变量 = 方法名(形参列表):

委托不能像方法那样直接调用,委托没有方法体,委托必须代理某个方法

委托实例名直接调用。如:
SayHello sayChinese = new SayHello(SayChinese);
sayChinese();

Inovke执行委托
​ 如果委托定义没有参数,则Inovke也没有参数;委托没有返回值,则Inovke也没有返回值

BeginInvoke开启一个新线程执行委托
​NetCore不支持,NetFamework支持 NetCore有更好的多线程功能来支持实现类似功能

EndInvoke等待BeginInvoke执行完成后再执行

实例化委托

通过new来实例化

public delegate void SayHello();
public delegate bool Delegate2(string arg);
static void Main(string[] args)
{
 	 // a. 实例化(让某个委托类型去代理一系列方法地址)  C# 1.0写法 
     SayHello sayHello1 = new SayHello(Method1);
     // 实例化有一种简写,只要方法满足委托的,就可以直接赋值给委托
     ayHello sayHello2 = Method2;  // 推荐
     sayHello1();//调用委托,相当于访问了Method1()
     sayHello2();//调用委托,相当于访问了Method2()
}
 public static void Method1()
 {
     Console.WriteLine("方法1");
 }
 public static void Method2()
 {
     Console.WriteLine("方法2");
 }

直接=一个方法,这个是编译器提供的语法糖

static void Main(string[] args)
{
	// 多播委托:一个委托实例,同时代理多个方法地址。
	// 多播委托:
	// 语法细节,第一次代理时,不能使用+=,第二次及之后,需要使用+=运算符重载。
	// 注意调用时,执行顺序。
	delegate = Method4;
	//delegate = Method3;// 重新赋值,把原来值替换。不叫多播委托。
	delegate -= Method4;
	delegate += Method3;
	// ......
}
	public static bool Method3(string arg)
        {
            Console.WriteLine("方法3");
            return arg == "hello";
        }
        public static bool Method4(string arg)
        {
            Console.WriteLine("方法4");
            return true;
        }

直接=一个匿名委托

static void Main(string[] args)
{
	// 使用匿名委托进行实例化,匿名委托本质就是匿名方法(匿名函数:没有名称方法) C# 2.0 写法           
 	Delegate2 delegate2 = Method3;// 代理非匿名方法
}
 private static bool Method3(string arg)
 {
     throw new NotImplementedException();
 }

直接=一个Lambda

public delegate string Delegate3(int a, int b);
internal class Program
{
    static void Main(string[] args)
    {
        // 通过拉姆达实例化委托   C# 3.0 写法
        Delegate3 delegate1 = Method5;

        Delegate3 delegate2 = (int a, int b) =>
        {
            return (a - b).ToString();
        };
    }
    public static string Method5(int a, int b)
    {
        return (a + b).ToString();
    }
}

委托的本质:

委托其实是将一个方法作为参数传递给另一个方法。(委托可以充当方法的回调函数的类型)

委托是方法的引用。(即委托是方法的代理)

委托可以引用多个方法。(如:多播委托)

C#中常用的委托

常见委托:Action,Action,Func,Predicate,Converter,EventHandler

Action:public delegate void Action();  表示是一个没有形参,且没有返回值的委托

Action:public delegate void Action(T1 arg1, T2 arg2);  表示是有多个不定形参,且没有返回值的委托

Func:public delegate TResult Func(); 表示没有形参,有一个返回值TResult的委托

Func:public delegate TResult Func(T arg);  表示有多个不定形参,且有一个返回值TResult的委托。

Predicate: public delegate bool Predicate(T obj); 表示拥有一个参数,且返回值是bool的委托。

多播委托

委托是一系列方法的引用,调用委托时,可以同时执行多个方法。
多播委托,就是用一个委托代理多个方法,调用委托时,可以执行多个方法。
多播委托的本质是运算符重载 += 、 -=
多播委托好处:广播事件(多次绑定事件,或者说绑定多个事件)

语法细节,第一次代理时,不能使用+=,第二次及之后,需要使用+=运算符重载。注意调用时,执行顺序。

你可能感兴趣的:(C#,c#,开发语言)