通俗的理解委托(二)

在通俗理解委托(一)中,我们讲到了委托的定义,声明和使用,接下继续讲Action Func,多播委托

一:Action,Fun

这两个方法都是微软给我们封装好了的

Action

Action是无返回值的泛型委托。

   Action 表示无参,无返回值的委托

   Action<int,string> 表示有传入参数int,string无返回值的委托

  Action<int,string,bool> 表示有传入参数int,string,bool无返回值的委托

Action<int,int,int,int> 表示有传入4个int型参数,无返回值的委托

   Action至少0个参数,至多16个参数,无返回值。

Func是有返回值的泛型委托

   Func<int> 表示无参,返回值为int的委托

   Func<object,string,int> 表示传入参数为object, string 返回值为int的委托

   Func<object,string,int> 表示传入参数为object, string 返回值为int的委托

   Func<T1,T2,,T3,int> 表示传入参数为T1,T2,,T3(泛型)返回值为int的委托

   Func至少0个参数,至多16个参数,根据返回值泛型返回。必须有返回值,不可void

这两种内置的泛型委托的声明和我们上一讲的声明方式一样有三种

Action的使用

 public static void JS(int index)
        {
            var b=index;
            Console.WriteLine(b);
        }
        static void Main(string[] args)
        {
            //常规声明
            Action<int> Show = new Action<int>(JS);
            Show(2);
            //匿名函数声明
            Action<int> Show2 = delegate (int x) { Console.WriteLine(x); };
            Show2(3);
            //lambda声明
            Action<int> Show3 = x => { Console.WriteLine(x + 8); };
            Show3(2);
            Console.ReadLine();
        }

Func的使用和Action类似我就不举例子了,他们的区别在于他们的返回值

二:多播委托

什么是多播委托呢,就是将多个方法注册我们的委托上了,下面我们看看多播委托的使用

        public static void JS1(int index)
        {
            var b=index+1;
            Console.WriteLine(b);
        }
        public static void JS2(int index)
        {
            var b = index+2;
            Console.WriteLine(b);
        }
        public static void JS3(int index)
        {
            var b = index+3;
            Console.WriteLine(b);
        }
        static void Main(string[] args)
        {
            Action<int> Show = JS1;//简写
            Show+= JS2;
            Show += JS3;
            Show(2);
            Console.ReadLine();
         }

这就是多播委托了,哈哈 ??,是不是很简单呢,想必大家看到了"+="这个写法,那么是不是可以写"-="呢,答案是肯定的,我们来看看"-="的效果

我们使用"-="将我们原来注册在委托上的方法给移除了

大家要注意一点的是:多播委托包含一个逐个调用委托集合,如果通过委托调用的其中一个方法抛出一个异常,整个迭代就会停止;
为了避免这个问题,应该自己迭代方法列表。Delegate类定义GetInvocationList()方法,他返回一个Delegate对象数组

大家可以看到委托上执行了到一个方法,第二个方法抛异常就不会往下执行了,我们使用GetInvocationList方法获取委托上注册的方法集合

有写的不对的地方欢迎大佬们指正

原文地址:https://www.cnblogs.com/wshnzxj/p/12638143.html

时间: 2024-10-12 19:06:15

通俗的理解委托(二)的相关文章

通俗的理解委托

一:什么是委托呢 我们来看看委托的定义 C#中的委托(Delegate) 类似于C或C++中函数的指针.委托(Delegate) 是存有对某个方法的引用的一种引用类型变量.引用可在运行时被改变. 对于不熟悉的人来说,看着这个就是一脸懵逼,我当初就是这样,一个泛泛的概念很难让人理解和记住,我们先不讲概念,直接看代码理解 二:怎么使用委托 Step1:定义委托 //delegate 定义委托 public delegate void MyDelegate(string name); Step2:实例

编写高质量代码改善C#程序的157个建议——建议44:理解委托中的协变

建议44:理解委托中的协变 委托中的泛型变量天然是部分支持协变的.为什么是“部分支持协变”?看下面示例: class Program { public delegate T GetEmployeeHanlder<T>(string name); static void Main() { GetEmployeeHanlder<Employee> getAEmployee = GetAManager; Employee e = getAEmployee("Mike"

深入理解OOP(二):多态和继承(继承)

本文是深入浅出OOP第二篇,主要说说继承的话题. 深入理解OOP(一):多态和继承(初期绑定和编译时多态) 深入理解OOP(二):多态和继承(继承) 深入理解OOP(三):多态和继承(动态绑定和运行时多态) 深入理解OOP(四):多态和继承(C#中的抽象类) 深入理解OOP(五):C#中的访问修饰符(Public/Private/Protected/Internal/Sealed/Constants/Static and Readonly Fields) 深入理解OOP(六):枚举(实用方法)

委托二--------使用委托实现冒泡排序

-------------------------------------------------------------Proson.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication2 {     public class Proson     {  

java数据结构与算法之递归思维(让我们更通俗地理解递归)

[版权申明]转载请注明出处(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53452971 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设计与实现 j

理解委托(delegate)及为什么要使用委托

理解委托(delegate)及为什么要使用委托 委托:是一种定义方法签名的类型. 当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联. 您可以通过委托实例调用方法. 上述为官方说法,理解起来比较难,举个生活中的例子: 某人有三子,让他们各自带一样东西出门,并带回一头猎物.上面一句话可以理解为父亲对儿子的委托:猎物 办法(工具 某工具)-->delegate 猎物(返回值) 带回猎物(委托名)(工具(参数类型) x)-->delegate int GetValue(int i)三个人执

设计模式理解(二)创建型——单例、原型

设计模式理解(二)单例(Singleton)与原型(Prototype) 为什么一起写,因为懒.... 单例,就是用了面向对象语言的一些奇技淫巧,把构造函数私有了,然后用一个自身类型的静态指针作为全局唯一的实例的引用.碰到并发之类就呵呵了. 这么简单都能画个UML图,还煞有介事似的,我晕. -----------------------   分割线   ------------------------ 原型(Prototype) 我理解就是给一个类糊弄个cloneable之类的接口,让它自己决定

没有代码也让你理解委托的作用

假如我们现在有个机器人,它有一个功能或者叫作方法,叫做dosomething(),然后我们在里面写实现代码,例如快过年了,就写拜年的方法 ,OK,然后过年的时候它就会向大家拜年了,现在到这里还是很正常的,但是新年过去了之后呢?拜年这个方法也就不用使用了, 这个时候我们就需要机器人干其他事情了,不可能买一个机器人就只是为了拜年吧?我现在想要机器人扫地,所以我们就需要修改 dosomething这个方法了,那怎么修改了,我想应该是修改代码之后再植入到机器人的芯片吧!但是这样的操作方法是违反了开封 闭

C#学习之初步理解委托、事件、匿名方法和Lambda

最经在学习LinqtoSql,然后扯到Lambda表达式,然后扯到匿名方法,然后扯到委托,最后扯到事件处理...后来发现对委托这个概念和事件处理这个过程理解得不是很清晰,遂得一下学习笔记.那里说得不对,请大家多多指教! 第一部分:理解委托 委托委托,顾名思义,就是类似于中间人的意思,有些事情你不做,委托别人去做,比如你想相亲,但你不想去主动约女孩子,那你可以交给媒婆去帮你约. 如果你学过C++,请把委托理解成函数指针,都是为了调用函数.函数指针可以调用符合该函数指针要求的函数.什么叫符合该函数指