C#委托

95 阅读2分钟

什么是委托

委托可以把一个方法作为参数带入另一个方法,可以理解为指向一个函数的指针

委托是一种类型,可以指向一个或多个方法,调用委托变量时执行的就是变量指向的方法

委托的原生用法

1、定义委托

.NET中定义了泛型委托Action(无返回值)和Func(有返回值),所以一般不需要自定义委托类型。

delegate void Del(int x);

2、实例化委托

又叫订阅委托。订阅委托有多种方法

//方法一:直接new一个委托
Del d1 = new Del(DoWork);

//方法二:将自定义方法赋值给委托
Del d2 = DoWork;

//方法三:通过匿名方法
Del d4 = delegate (int y) {
    DoWork(y);
};

DoWork、DoWork2是自定义方法

void  DoWork(int x) {
    lblResult.Text= "成功调用";
}
void DoWork2(int x) {
    lblResult.ForeColor = Color.Green;
}

3、调用委托

d1(1);

委托的多播

通过“+=”运算符将多个方法对象分配到一个委托实例上,形成多播委托

注意不能一开始就用+=,必须先用=赋值,才能使用+=

Del d3= DoWork;
d3 += DoWork2;

委托指向匿名方法

委托变量不仅可以指向普通方法,还可以指向匿名方法

//Func泛型最后一个参数代表返回值类型,前面的代表参数类型
Func<int, int, string> f1 = delegate (int x, int y)
{
    return $"{x}+{y}={x + y}";
};
//调用
string s=f1(1,2);

Action f1 = delegate ()
{
    Console.WriteLine("haha");
};
//调用
f1();

委托指向lambda表达式

因为匿名方法可以写成lambda表达式,所以可以省略参数数据类型,编译器能够根据委托类型推断出参数类型

Func<int, int, string> f1 = (x, y) => {
    return $"{x}+{y}={x + y}";
};

如果委托的方法体只有一行代码,且无返回值,可省略花括号{ }

Action<int, string> people = (age, name) =>
    Console.WriteLine($"年龄{age},姓名{name}");

如果委托的方法体只有一行代码,且有返回值,可省略花括号{ }和return

Func<int, int, string> f1 = (x, y) =>
    $"{x}+{y}={x + y}";

如果委托只有一个参数,参数的小括号()可以省略

Action<string> f1=s=>Console.WriteLine(s);

Func<int, bool> f2 = i => i > 5;

匿名方法

没有函数名,只有delegate关键字+主体,只能通过委托调用

委托和事件的区别

委托的本质,是一个类。而事件,是一个委托类型的私有变量加上两个公有方法(事件的+=和-=),这是本质区别。事件里面其实就两个方法(即add_event()和remove_event())。这两个方法里面分别是对这个私有的委托变量进行的合并和移除,当调用事件的+=时其实是调用的事件里面的add_event()方法,同样-=调用的是remove_event()方法。

事件是委托的封装,可以理解为一种特殊的委托。