持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情
前言
已经差不多有四五年没有做 .net 开发。然而新工作任务有一部分是做 C#开发,一部分是做 Golang 开发。所以需要重新重温下 C# 的相关语法和编程特性等内容。今天主要是要说下 C# 的委托。
委托是什么
委托,是一种类型。比如 int a 中 int 是一种类型。C# 中使用 delegate 关键字和函数签名来声明委托。委托既可以在勒外部声明也可以在类内部声明。
[修饰符] delegate [返回类型] [委托名称](参数)
// demo
public delegate void DoHandler(string name)
以上代码中,声明了一个 doHandler 带有 void 返回值,字符串参数的委托。
首先需要了解下,委托是干什么的?委托是函数的引用。将方法分配给委托委托就与方法就有相同的方法。所以声明委托就是声明了一个可以接收什么样方法的委托。如上面代码声明委托的方法是可接收字符串参数无返回值的方法。
委托的使用
// 将方法作为参数
DoHandler de1= new DoHandler(SayHi);
// 直接赋值
DoHandler de2 = SayHi;
// 箭头函数
DoHandler de3 = (string name)=> {
Console.WriteLine("hi,"+ name);
}
// 方法
static void SayHi(string name){
Console.WriteLine("hi,"+ name);
}
以上通过三种方式将方法委托给委托类型。委托之后就是可以调用委托了。
de1.Invoke("Tommy");
// 或者
del("Jack")
多方法委托
委托还支持多个方法的委托。指向多个方法的委托可称为多播委托。使用+或+=就可以将方法添加到委托队列中,-或-=就是从委托中删除。
DoHandler del = de1 + de2
del 的执行结果是最后分配方法的返回值。
泛型委托
public delegate T SayHi<T>(T param1, T param2)
使用和委托相同的方式定义泛型微透,返回类型可以使用泛型或其他返回类型。具体使用的时候就需要明确指定泛型类型。
SayHi<String> sayhi = SayHi;
public static String SayHi(string name1, string name2){
//do something
}
总结
委托机制很好的将方法声明喝实现进行分离。将方法的引用封装在委托对象中,然后将委托对象传递给需要引用方法的代码。这样就可以将过程调用转成对象的调用。