委托-委托的介绍_哔哩哔哩_bilibili

在一些业务比较复杂的场景下就更需要运行委托来实现代码的重用,业务的解耦,保持代码的稳定性以及扩展性。

委托应用场景

1、方法的回调

2、使用多线程

委托是一个密封(sealed)类,并且有四个方法。invoke,Begininvoke,Endinvoke

父类是MulticastDelegate  多播委托【注册绑定多个具有相同签名的方法。触发多个方法】

1、通过反射可以查看

2、反编译(ILSpy)

委托是什么?事件是不是一种委托?

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

程序中将所需要做的事封装成一个方法,然后调用这个方法。【例子:程序写个计算器。定义一个委托,然后写四个加减乘除方法,最后我通过委托来执行我所需的方法(加减乘除)】

定义一个方法

static double Add(double x,double y)

{ return x+y; }

定义委托  [delegate]    public delegate double Cal(double x,double y);  

实例化委托    Cal  c=new Cal(Add);  或者  Cal  c=Add;

执行委托   double ret= c(1,2);

匿名方法:C#2.0以后出现的,不在像之前委托那样,实例化委托,然后委托调用方法,可以直接调用方法

lambda:C#3.0以后出现,写法更加简洁

C#的委托是CTS(公共类型系统)规定的5种类型之一。(类类型,结构类型,接口类型,枚举类型,委托类型)。它类似于c或c++中的函数的指针。但函数指针只能引用静态方法。而委托既能引用静态方法,也能引用实例方法。委托是存在有对某个方法的引用的一种引用类型变量。(也就是委托类型)。引用可在运行时被修改。 C#的事件并不是委托的一种,事件(event)基本上可以说是一个用户操作,如按键,点击、鼠标移动等等。或者是一些系统生成的通知。事件使用的是发布和订阅模型。也就是说明事件的类为发布器。而需要对这个事件进行处理的类则为订阅器。那订阅器要怎么知道这个事件是否发生了呢?这个时候就用到了委托。委托负责告诉订阅器。事件发生了。并告诉他要调用哪个方法。委托其实是发布器和订阅器之间的一个桥梁。所以事件的实现依赖于委托,但事件并非是委托的一种。事件内部就是一个pivate的委托,加上 ADD和Remove两个方法。

委托是寻址的.NET版本。在C++中,函数指针只不过是⼀个指向内存位置的指针,它不是类型安全的。我们⽆法判断这个指针实际指向什么,像参数和返回类型等项久更⽆从知晓了。

⽽.NET委托完全不同,委托是类型安全的类,它定义了返回类型和参数的类型。委托类不仅包含对⽅法的引⽤,也可以包含对多个⽅法的引⽤。理解委托的⼀个要点是它们的安全性⾮常⾼。在定义委托时,必须给出它所表示的⽅法的签名和返回类型等全部细节。理解委托的⼀种⽐较好的⽅式是把委托当作这样⼀件事情:它给⽅法的签名和返回类型指定名称。其语法类似于⽅法的定义,需要在定义⽅法的前⾯加上delegate关键字。定义委托基本上就是定义⼀个新的类,所以可以在任何地⽅定义类的相同地⽅定义委托,也就是说,可以在另⼀个类的内部定义,也可以在任何类的外部定义,还可以在名称控件中把委托定义为定义为顶层对象。访问修饰符可以是public/private/protected等。

.NET默认的委托类型有哪⼏种? 什么是泛型委托?

1. Action < T >

 Action无返回值的委托。

Action  无参无返

Action<T1>  一个参数

Action<T1,T2,......T16> 最多支持16个

 泛型Action委托表示引⽤⼀个void返回类型的⽅法。这个委托类存在16种重载⽅法。

例如Action<in T1,In T2>调⽤没有参数的⽅法

2.Func< T >

Func有返回值的委托

Func<Out>  有返

Func<T1,Out>   一个参数,有返

Func<T1,T2,......T16,Out> 最多支持16个

Func调⽤带返回类型的⽅法。有16种重载⽅法。

例如Func委托类型可以调⽤带返回类型且⽆参数的⽅法,Func<in T,out TResult>委托类型调⽤带有4个参数和⼀个返回类型的⽅法。

延迟执⾏ (Lazy Loading)是什么?

⼤部分LINQ语句是在最终结果的第⼀个元素被访问的时候(即在foreach中调⽤MoveNext⽅法)才真正开始运算的,这个特点称为延迟执⾏。⼀般来说,返回另外⼀个序列(通常为IEnumerable或IQueryable)的操作,使⽤延迟执⾏,⽽返回单⼀值的运算,使⽤⽴即执⾏。IEnumerable是延迟执⾏的,当没有触发执⾏时,就不会进⾏任何运算。Select⽅法不会触发LINQ的执⾏。⼀些触发的⽅式是:foreach循环,ToList,ToArray,ToDictionary⽅法等