委托是什么?事件是不是一种委托?
委托可以把一个方法作为参数带入另一个方法。委托可以理解为指向一个函数的指针。
C#的委托是CTS(公共类型系统)规定的5种类型之一。(类类型,结构类型,接口类型,枚举类型,委托类型)。它类似于c或c++中的函数的指针。但函数指针只能引用静态方法。而委托既能引用静态方法,也能引用实例方法。委托是存在有对某个方法的引用的一种引用类型变量。(也就是委托类型)。引用可在运行时被修改。 C#的事件并不是委托的一种,事件(event)基本上可以说是一个用户操作,如按键,点击、鼠标移动等等。或者是一些系统生成的通知。事件使用的是发布和订阅模型。也就是说明事件的类为发布器。而需要对这个事件进行处理的类则为订阅器。那订阅器要怎么知道这个事件是否发生了呢?这个时候就用到了委托。委托负责告诉订阅器。事件发生了。并告诉他要调用哪个方法。委托其实是发布器和订阅器之间的一个桥梁。所以事件的实现依赖于委托,但事件并非是委托的一种。事件内部就是一个pivate的委托,加上 ADD和Remove两个方法。
委托是寻址的.NET版本。在C++中,函数指针只不过是⼀个指向内存位置的指针,它不是类型安全的。我 们⽆法判断这个指针实际指向什么,像参数和返回类型等项久更⽆从知晓了。
⽽.NET委托完全不同,委托是类型安全的类,它定义了返回类型和参数的类型。委托类不仅包含对⽅法的 引⽤,也可以包含对多个⽅法的引⽤。理解委托的⼀个要点是它们的安全性⾮常⾼。在定义委托时,必须给出它所表示的⽅法的签名和返回类型等全部细节。理解委托的⼀种⽐较好的⽅式是把委托当作这样⼀件事情:它给⽅法的签名和返回类型指定名称。其语法类似于⽅法的定义,需要在定义⽅法的前⾯加上delegate关键字。定义委托基本上就是定义⼀个新的类,所以可以在任何地⽅定义类的相同地⽅定义委托,也就是说,可以在另⼀个类的内部定义,也可以在任何类的外部定义,还可以在名称控件中把委托定义为定义为顶层对象。访问修饰符可以是public/private/protected等。
.NET默认的委托类型有哪⼏种?
1. Action < T >
泛型Action委托表示引⽤⼀个void返回类型的⽅法。这个委托类存在16种重载⽅法。
例如Action<in T1,In T2>调⽤没有参数的⽅法2.Func< T >
Func调⽤带返回类型的⽅法。有16种重载⽅法。
例如Func委托类型可以调⽤带返回类型且⽆参数的⽅法,Func<in T,out TResult>委托类型调⽤带有4个参数和⼀个返回类型的⽅法。
什么是泛型委托?
Action就是泛型委托。注意事项:
建议尽量使⽤这些委托类型,⽽不是在代码中定义更多的委托类型。这样可以减少系统中的类型数⽬,同时简化编码
如果需要使⽤ref或out关键字,以传引⽤的⽅式传递⼀个参数,就可能不得不定义⾃⼰的委托: delegate void Test(ref int i)
如果委托要通过C#的params关键字获取可变数量的额参数,要为委托的任何桉树指定默认值,或者要对委托的泛型类型参数进⾏约束,也必须定义⾃⼰的委托类型
delegate void EventHandler(Object sender, TEventArgs e) where TEventArgs : EventArgs;
使⽤获取泛型实参和返回值的委托时,可利⽤逆变与协变。逆变:⽗类转换为⼦类;协变:⼦类转换为⽗类
延迟执⾏ (Lazy Loading)是什么?
⼤部分LINQ语句是在最终结果的第⼀个元素被访问的时候(即在foreach中调⽤MoveNext⽅法)才真正开始运算的,这个特点称为延迟执⾏。⼀般来说,返回另外⼀个序列(通常为IEnumerable或IQueryable)的操作,使⽤延迟执⾏,⽽返回单⼀值的运算,使⽤⽴即执⾏。IEnumerable是延迟执⾏的,当没有触发执⾏时,就不会进⾏任何运算。Select⽅法不会触发LINQ的执
⾏。⼀些触发的⽅式是:foreach循环,ToList,ToArray,ToDictionary⽅法等
标签:返回,知识点,定义,委托,C#,参数,事件,类型,net From: https://www.cnblogs.com/aikeming/p/17126426.html