C#

C#委托

"面试小记"

Posted by Mas9uerade on November 15, 2020

“面试知识点整理”

Action和function区别

Delegate类是委托类型的基类。 但是,只有系统和编译器才能显式从 Delegate 类或 MulticastDelegate 类派生。 也不允许从委托类型派生新类型。 Delegate类不被视为委托类型; 它是用于派生委托类型的类。

大多数语言都实现 delegate 关键字,这些语言的编译器可以从 MulticastDelegate 类派生; 因此,用户应使用 delegate 语言提供的关键字。

Action 与 Func是.NET类库中增加的内置委托,以便更加简洁方便的使用委托。

两种委托类型的区别在于:Action委托签名不提供返回类型,而Func提供返回类型。

内部实现

泛型签名的函数指针

Action委托具有Action、Action<T1,T2>、Action<T1,T2,T3>……Action<T1,……T16>多达16个的重载,其中传入参数均采用泛型中的类型参数T,涵盖了几乎所有可能存在的无返回值的委托类型。

Func则具有Func、Func<T,Tresult>……Func<T1,T2,T3……,Tresult>17种类型重载,T1……T16为出入参数,Tresult为返回类型。

注册函数如何防止重复

  1. 注册函数的时候,先获取委托列表,使用反射进行便利,对比委托列表里的函数名和实例对象

  2. 先删除,再注册

如何删除

Delegate.Remove(Delegate, Delegate) 方法

  • 命名空间:

    System

  • 程序集:

    System.Runtime.dll

从一个委托的调用列表中移除另一个委托的最后一个调用列表。

C#复制

public static Delegate Remove (Delegate source, Delegate value);

参数

委托,将从中移除 value 的调用列表。

委托,它提供将从其中移除 source 的调用列表的调用列表。

返回

一个新委托,其调用列表的构成方法为:获取 source 的调用列表,如果在 value 的调用列表中找到了 value 的调用列表,则从中移除 source 的最后一个调用列表。 如果 sourcenull,或在 value 的调用列表中没有找到 value 的调用列表,则返回 source。 如果 value 的调用列表等于 source 的调用列表,或 source 为空引用,则返回空引用。

例外

MemberAccessException

调用方不能访问由委托表示的方法(例如,在方法为私有方法的情况下)。

ArgumentException

委托类型不匹配。

注解

如果的调用列表 value 与的调用列表中的一组连续元素相匹配,则在的 source 调用列表 value中将出现的调用列表 source 。 如果的调用列表 value 在的调用列表中出现多次 source ,则将删除最后一个匹配项。