“面试知识点整理”
Action和function区别
Delegate类是委托类型的基类。 但是,只有系统和编译器才能显式从 Delegate 类或 MulticastDelegate 类派生。 也不允许从委托类型派生新类型。 Delegate类不被视为委托类型; 它是用于派生委托类型的类。
大多数语言都实现 delegate 关键字,这些语言的编译器可以从 MulticastDelegate 类派生; 因此,用户应使用 delegate 语言提供的关键字。
Action 与 Func是.NET类库中增加的内置委托,以便更加简洁方便的使用委托。
两种委托类型的区别在于:Action委托签名不提供返回类型,而Func提供返回类型。
内部实现
泛型签名的函数指针
Action委托具有Action
Func则具有Func
注册函数如何防止重复
-
注册函数的时候,先获取委托列表,使用反射进行便利,对比委托列表里的函数名和实例对象
-
先删除,再注册
如何删除
Delegate.Remove(Delegate, Delegate) 方法
-
命名空间:
-
程序集:
System.Runtime.dll
从一个委托的调用列表中移除另一个委托的最后一个调用列表。
C#复制
public static Delegate Remove (Delegate source, Delegate value);
参数
-
source
委托,将从中移除 value 的调用列表。
-
value
委托,它提供将从其中移除 source 的调用列表的调用列表。
返回
一个新委托,其调用列表的构成方法为:获取 source 的调用列表,如果在 value 的调用列表中找到了 value 的调用列表,则从中移除 source 的最后一个调用列表。 如果 source 为 null,或在 value 的调用列表中没有找到 value 的调用列表,则返回 source。 如果 value 的调用列表等于 source 的调用列表,或 source 为空引用,则返回空引用。
例外
调用方不能访问由委托表示的方法(例如,在方法为私有方法的情况下)。
委托类型不匹配。
注解
如果的调用列表 value 与的调用列表中的一组连续元素相匹配,则在的 source 调用列表 value中将出现的调用列表 source 。 如果的调用列表 value 在的调用列表中出现多次 source ,则将删除最后一个匹配项。