委托的全面知识总结(C#)
一.定义与本质委托是干什么的委托就是用来存 方法 的容器你可以把一个方法当成 数据 一样传递1.什么是委托委托是C#中类型安全的函数指针它是一种“类型”可以存储调用传递一个或多个方法的引用2.核心本质委托是类似类的引用类型但它存储的是地址方法的地址,而非数据委托是类型安全的绑定的方法必须与委托的签名返回值参数类型/个数完全一致也就是说委托有几个参数什么类型返回值是什么样的方法必须和它完全一致不这样设定就会导致运行时出错所以说是类型安全的。委托是可多播的一个委托可以绑定多个方法调用时按顺序执行二.委托的声明1.声明语法访问修饰符 delegate 返回值类型 委托名参数列表public delegate void MyDelegate (int a , string b)访问修饰符public/private/protected/internal默认internal返回值类型可以是void或任意类型参数列表可以是 0 个或多个参数类型必须明确。2.定义位置3种合法位置命名空间下全局整个命名空间可访问类/结构体里仅类内部可访问嵌套类内部极少用禁止定义在方法内部三.委托的实例化与调用1.实例化方式方式一.传统new// 声明委托 public delegate void PrintDelegate(string msg); // 定义匹配方法 static void Print(string msg) { Console.WriteLine(msg); } // 实例化 PrintDelegate del new PrintDelegate(Print);2.委托绑定实例方法必须通过对象实例调用不能直接用方法名绑定静态方法可以直接用方法名绑定3.lambda直接使用委托加lambda的方式代替方法四系统内置委托1.无返回值委托Action所有Action系列委托永远没有返回值voidAction 无参无返回值ActionT1,T2 2 个参数、无返回值委托绑定方法时参数数量、类型、顺序必须完全一致且都不能有返回值Actionint, int 自定义委托名 方法名;//绑定方法2.有返回值委托FuncFuncint, int // 1个int参数返回int Funcint, int, int // 2个int参数返回int ← 你求乘积就用这个 Funcstring, int, bool // 1 string 1 int返回bool五.用lambda表达式实现Funcint, int, int func2 (a, b) a * b;int result func2(5, 10);六.给委托绑定多个方法多播1.使用方法用绑定用-取消绑定一次调用委托所有绑定的方法都会按顺序执行using System; class Program { static void Main() { // 1. 先创建委托 Action action Method1; // 2. 用 继续绑定多个方法 action Method2; action Method3; // 3. 调用一次 → 三个方法全部执行 action(); } static void Method1() { Console.WriteLine(方法1执行); } static void Method2() { Console.WriteLine(方法2执行); } static void Method3() { Console.WriteLine(方法3执行); } }2.使用规则只有Action/ 自定义委托返回值void适合绑定多个因为多个方法执行只会返回最后一个方法的结果所以Func一般不绑定多个方法没意义执行顺序按照你绑定的顺序依次执行清空所有绑定action null;3.安全调用委托调用方式编译是否报错运行时null时推荐程度dic();❌ 不报错❌ 抛空引用异常⭐ (禁止直接用)dic.Invoke();❌ 不报错❌ 抛空引用异常⭐ (禁止直接用)dic?.Invoke();❌ 不报错✅ 什么都不做安全⭐⭐⭐⭐⭐ (推荐) 补充?.空条件运算符的作用?.是 C# 6.0 引入的空条件运算符如果委托不为null就正常调用Invoke()如果委托为null直接返回null不执行任何代码也不抛异常是 C# 中调用委托的标准安全写法彻底避免空引用异常4.问题1.两个方法的参数类型不同数量不同是不是没法绑定到同一个委托上委托本质是方法签名的约束它规定了参数个数参数类型返回值类型这三样必须完全一模一样方法才能绑定到这个委托有一个不同编译器会直接报错没法绑定到同一个委托上2.有返回值的委托多播会怎么样会直接覆盖只返回最后一个方法的返回值。想使用有返回值委托多播可以用列表存储返回结果
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2479810.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!