C# 委托的使用

192 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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
}

总结

委托机制很好的将方法声明喝实现进行分离。将方法的引用封装在委托对象中,然后将委托对象传递给需要引用方法的代码。这样就可以将过程调用转成对象的调用。