泛型类型参数支持协变和逆变,可在分配和使用泛型类型方面提供更大的灵活性。 在引用类型系统时,协变、逆变和不变性具有如下定义。...在调用类型 Action 的委托(就像它是类型 Action的委托一样)时,其参数必须属于类型 Derived。...Action 泛型委托(如 Action)具有逆变参数类型。 这意味着,可以将委托指派给具有派生程度较高的参数类型和(对于 Func 泛型委托)派生程度较低的返回类型的变量。...然后,使用泛型类型参数的协变和逆变,将得到的泛型委托指派给另一个变量,此变量的泛型委托类型的参数类型为 Type3 ,返回类型为 Type1。...在 .NET Framework 4 之前,定义包含这些批注的泛型类的唯一方法就是利用 Ilasm.exe(IL 汇编程序) 编译该类或在动态程序集中发出该类,从而使用 Microsoft 中间语言 (
对于 GetUsers方法,我们可以创建下面的委托方法来绑定: Func fun; 注意这里使用的是非泛型的 IEnumerable接口,在C++需要使用下面这个命名空间...在C++端看来,SaveUsers方法的参数对象是一个泛型集合,但是具体是什么对象并不知道,所以需要反射出泛型集合的类型,同时还需要构建这样一个泛型集合对象实例。...一切准备就绪,下面可以通过以下步骤提交集合数据给.NET方法了: 1,反射.NET方法,获取参数的泛型形参类型; 2,创建此泛型形参的泛型List对象实例; 3,遍历C++集合(列表list),将结构数据赋值给动态创建的实体类对象...>,bool> fun; Func,bool> fun2; 很明显,委托方法 fun2不能绑定,因为参数是 in 的,不是方法out的,所以调用的参数类型不能使用派生程度更小的类型...NET程序端,我们使用了弱类型的泛型集合,综合起来还是反射+委托方法执行,效率要高。
这样,我们之前为委托实例添加的方法,在调用委托时,就根据添加顺序依次调用了,这种通过委托一次性调用多个方法的过程,称作委托的多播。...Action和Func泛型委托 如果你不知道泛型,也不必担心这两个委托难以上手,Action和Func泛型委托是微软为我们实现定义好的两组委托,这两组委托,足以满足我们的日常使用,而无需自己去定义委托...Func委托,它托管有返回值的方法,它的构造方法的重载有17个之多,也就是说,你可以用它匹配最多有16个参数的带有返回值的方法 Action委托,它托管没有返回值的方法,同func委托一样,它可以最多匹配...16个参数的无返回值方法 由此,我们上文中的代码就可以重构一下了: 把参数类型或者返回值类型(如果需要它们)写在尖括号中,它的实现原理是泛型,如果不明白泛型,请留意后期的文章。...委托在方法参数中的应用 如果你想实现方法的多样化定制,使用委托作为参数是必不可少的。
在启动任务时,会创建Task类 的一个实例,利用Action或Action委托不带参数或带一个object参数 ,可以指定应运行的代码,这类似于Thread类 。...泛型无返回值委托Action,有返回值Func,虽然使用Delegete委托可以达到同样的效果,但是用Action等泛型委托写法要更简洁。...除了Delegate委托我们还可以使用Action和Func委托。 泛型Action委托表示引用一个void返回类型的方法。...Action委托类存在不同的变体,可以传递至多16种不同的参数类型,没有泛型参数的Action类可以调用没有参数的方法。...例如:Action调用带一个参数的方法,Action调用带两个参数的方法等 Func的用法和Action用法类似,但是Func表示引用一个带返回类型的方法
Action Action是无返回值的泛型委托。...Func Func是有返回值的泛型委托 Func 表示无参,返回值为int的委托 Func 表示传入参数为object, string 返回值为int的委托...Func 表示传入参数为object, string 返回值为int的委托 Func 表示传入参数为T1,T2,,T3(泛型)返回值为...int的委托 Func至少0个参数,至多16个参数,根据返回值泛型返回。...b); } (4) .predicate predicate 是返回bool型的泛型委托 predicate 表示传入参数为int 返回bool的委托 Predicate有且只有一个参数
委托的定义 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性...6.可以将多个方法赋给同一个委托,或者叫将多个方法绑定到同一个委托,当调用这个委托的时候,将依次调用其所绑定的方法。 匿名委托:Action,Func和Predicate。...1.Action是无返回值的泛型匿名委托。Action表示有传入参数int,string无返回值的委托。 2.Func是有返回值的泛型委托。...Func表示无参,返回值为int的委托,Func 表示传入参数为object, string 返回值为int的委托。...3.Predicate的使用:等同于Func。表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由Array和List类的几种方法使用,用于在集合中搜索元素。
委托的使用跟方法的调用一致: 另外,我们如果为委托实例添加多个方法,在调用委托时,就会根据添加顺序依次调用,这种通过委托一次性调用多个方法的过程,称作委托的多播。...Action和Func泛型委托 Action和Func泛型委托是微软为我们实现定义好的两组委托,这两组委托,足以满足我们的日常使用,而无需自己去定义委托。...Action委托,它托管没有返回值的方法,同func委托一样,它可以最多匹配16个参数的无返回值方法。...由此,以上我们自定义的委托就可以换为以下代码: 把参数类型或者返回值类型(如果需要它们)写在尖括号中,它的实现原理是泛型,如果不明白泛型,请留意后期的文章。...委托在方法参数中的应用 如果你想实现方法的多样化定制,使用委托作为参数是必不可少的: 想通过一个方法实现不同的操作,可以动态的去改变代码逻辑,这就需要使用委托,用方法封装一些固定的逻辑
C#2中有了泛型,所以我们可以使用List、Dictionary。泛型能够带来很好的编译时类型检查,也不会有装箱拆箱的操作,因为类型是在使用泛型的时候就已经指定了。....NET已经通过了很多的泛型类型供我们使用,如上面提到的List,Dictionary,我们也可以自己来创建泛型类型(类、接口、委托、结构)或是方法。...在定义泛型类型或时可以通过定义泛型约束来对泛型参数进行限制,更好的使用编译时检查。...C#2中可空类型主要是使用System.Nullable的泛型类型,类型参数T有值类型约束。...静态类型中当我们要使用程序集中的类,要调用类中的方法,编译器必须知道程序集中有这个类,类里有这个方法,如果不能事先知道,编译时会报错,在C#4以前可以通过反射来解决这个问题。
public delegate int MethodtDelegate(int x, int y);表示有两个参数,并返回int型。 Action Action 是无返回值的泛型委托。...public void Test(Action action,T p) { action(p); } Func Func 是有返回值的泛型委托...,int> 表示传入参数为 object, string 返回值为 int 的委托 Func 表示传入参数为 T1,T2,,T3(泛型)返回值为 int 的委托 Func...至少 0 个参数,至多 16 个参数,根据返回值泛型返回。...此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素。
和Func Action和Func都是.NET Framework内置的泛型委托,免声明直接实例化调用。.../* Action是.NET Framework内置的泛型委托,要求委托必须无返回值 */ Action参数类型> 委托对象名 = 方法名 //有参情况 Action 委托对象名 = 方法名 //无参情况.../* Func是.NET Framework内置的泛型委托,支持有参有返回值 */ Func 委托对象名 = 方法名 Func 参数, 返回类型> 委托对象名 = 方法名 Func 委托 static void Main(string[] args) { //Action是.NET Framework内置的泛型委托,要求委托必须无返回值...一个合并委托调用它所合并的N个委托。在实际工作中,我们常常创建一个委托被调用时要调用的方法的调用列表。
在 C# 中,通常使用委托或 lambda 表达式将方法作为参数传递。 将方法作为参数传递 |使用 C# 编程掌握委托 委托是引用具有特定签名的方法的类型,允许您将方法作为参数传递给其他方法。...在现代 C# 编程中,灵活性和可重用性是构建高效、可维护的应用程序的关键。实现动态行为的一个强大功能是将方法作为参数传递给其他方法的能力。这就是代表发挥作用的地方。...将方法作为参数传递 |使用 C# 编程掌握委托 将方法分配给委托人: 将方法作为参数传递 |使用 C# 编程掌握委托 3. 将委托作为参数传递 您可以将委托作为参数传递给其他方法,以动态定义行为。...Func 和 Action 委托 C# 提供泛型委托,而不是声明自定义委托类型: Func:当方法返回值时使用。 操作:当方法返回 时使用。...在 C# 中使用委托将方法作为参数传递是创建灵活且可重用代码的强大功能。您可以使用委托、lambda 表达式和内置类型(如 和 )动态分配、传递和调用方法。
在这一节中,我将从结合泛型来谈一谈在我们编写框架代码的时候,如何更为高效的定义我们的委托。...为了解决这一定义爆炸,c#提供了三种基本的泛型委托,我们只需要改变泛型参数,就能够达到定义不同的委托: Predicate 该泛型委托的原型定义如下: public delegate bool...Action or Action 泛型Action委托表示引用一个void返回类型的方法。...Action委托类存在不同的变体,可以传递至多16种不同的参数类型,没有泛型参数的Action类可以调用没有参数的方法。...例如:Action调用带一个参数的方法,Action调用带两个参数的方法等.。
定义委托 有时候可能想要将一个方法传递给另一个方法。在C++中使用函数指针来实现,在JavaScript中由于函数也是对象所以直接可以在参数列表中传递。而在C#中需要使用委托。...没有泛型参数的Action委托可以表示没有参数的方法,Action表示有一个参数的方法,Action表示有两个参数的方法……最多可以有16个参数。...和Action一样,Func表示没有参数、有返回值的方法,Func表示有一个参数、有返回值的方法……最多可以有16个参数和一个返回值。...有这些泛型委托,很多时候就不需要自己手动定义泛型了。这样,上面的例子就可以修改一下。...//使用Func泛型委托 static void DoCalc(int a, int b, Func op) { Console.WriteLine($"a和
自 .NET Framework 3.5 (C# 3.0)以来,各种泛型委托纷涌而至,原先需要我们程序员手动定义的一些委托现在我们可以直接使用预定义的委托了,大大提高了开发效率,现在我们就首先来看看这些预定义的泛型委托...这里,我们再来看看List类型的ForEach方法是怎么使用Action委托的: 现在,我们可以知道,原来所不解的东西现在终于释怀了:在ForEach会通过一个循环遍历依次调用委托所持有的方法,这个方法是一个符合..., TResult> selector); 可以看出,Select方法中的参数采用了Func泛型委托,根据泛型委托的定义TSource和TResult分别代表要传入的数据类型以及要返回的数据类型。...当然,和Action类似,.NET基类库为我们也提供了多达16个输入参数的Func委托,但是,输出参数却只有1个。...参考文章 (1)金旭亮,《C#面向对象程序设计》,教案6-委托与事件讲义:http://download.csdn.net/detail/bitfan/3324733 (2)MSDN,泛型委托(
文章目录 前言 一、委托、匿名方法、Lambda、泛型委托、表达式树的进化史 1.委托 1.1 无返回值委托 1.2 有返回值委托 1.3 多播委托 2.匿名方法 3.Lambda表达式 4.泛型委托...然而,C# 的委托实现受到了函数指针和C++中的函数对象的启发。 在.NET框架中,委托最初被引入为事件处理程序的机制。事件是一种广泛使用的编程模型,用于在程序中处理异步和交互性操作。...委托在.NET中被广泛使用,不仅用于事件处理程序,还用于Lambda表达式和LINQ查询等高级编程概念。它们使得在.NET框架中编写高效和易于理解的代码变得更加容易。...在 Main 方法中,我们调用了这些委托实例,并将它们作为函数来使用,传递了两个整数参数,并将结果存储在变量 result1 和 result2 中,然后将这些结果输出到控制台。...这个示例展示了泛型委托在.NET中的用法,它可以接受任何类型的参数和返回值,使得我们可以写出更加灵活的代码。
看到大家的留言,我想说下我对委托的了解,首先看它的定义: 委托 就是将方法作为方法的参数 不用先看例子什么的,你就多品味品味这句话,然后你看下使用委托的步骤, 1.定义一个委托 2.注册该委托 3.使用委托...delegate1("houhou"); OK,委托完成,其实不要怕,委托真的很简单…… 下面介绍几个已定义好的委托 1.Action Action是无返回值的泛型委托。...int Fun(int a, int b) { return a + b; } Func是有返回值的泛型委托 3.predicate 是返回bool...型的泛型委托泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法。...如果 X 和 Y 字段的乘积大于 100,000,此委托表示的方法 ProductGT10 将返回 true。Find 方法为数组的每个元素调用此委托,在符合测试条件的第一个点处停止。
L#的10-20倍| 4、选择性的CLR绑定使跨域调用更快速,绑定后跨域调用的性能能达到slua的2倍左右(从脚本调用GameObject之类的接口) 5、支持跨域继承 6、完整的泛型支持 7、拥有Visual...dll动态链接库,pdb程序数据二进制文件,pdb文件保存着调试和项 目状态信息,主要作用是调试。...); }); }); 为了避免不必要的麻烦,以及后期热更出现问题,建议: 1、尽量避免不必要的跨域委托调用 2、尽量使用Action以及Func委托类型 跨域继承 建议直接看demo中的Inheritance...//ILRuntime内部是用Action和Func这两个系统内置的委托类型来创建实例的,所以其他的委托类型都需要写转换器 //将Action或者Func转换成目标委托类型...void RegisterDelegateConvertor(Func action) //RegisterMethodDelegate最多支持五个泛型
尤其是在它们的泛型版本出来以后,已经能够满足我们在实际编码过程中的大部分需要。 我们应该习惯在代码中使用这类委托来代替自己的委托声明。...9.使用event关键字为委托施加保护# 首先没有event加持的委托,我们可以对它随时进行修改赋值,以至于一个方法改动了另一个方法的委托链引用,比如赋值为null,另外一个方法中调用的时候将抛出异常。...12.让接口中的泛型参数支持协变# 除了11中提到的使用泛型参数兼容泛型接口的不可变性外,还有一种办法就是为接口中的泛型声明加上out关键字来支持协变。...out关键字是FCL 4.0中新增的功能,它可以在泛型接口和委托中使用,用来让类型参数支持协变性。通过协变,可以使用比声明的参数派生类型更大的参数。通过下面例子我们应该能理解这种应用。...在我们自己的代码中,如果要编写泛型接口,除非确定该接口中的泛型参数不涉及变体,否则都建议加上out关键字。协变增大了接口的使用范围,而且几乎不会带来什么副作用。
由于大部分从TextBox控件中获取数据值,可以扩展个泛型方法出来,直接根据转换后的数据类型获得值,类似这样, var value = this.txtSample.GetValue使用 using 指令将命名空间显式导入到源代码中之后,扩展方法才位于范围中。 注意:扩展方法是在非嵌套、非泛型静态类内部定义的 2....由于转换类型未知,但为值类型,故采用泛型方法设计,并加上strut泛型约束,由于允许自定义处理转换失败时的操作,故传入一个Action委托来实现,如下: public static TResult GetValue...定义转换失败操作的委托 C#内置封装的委托有两种,Action和Func委托,并有很多的重载版本,参数可以有十多个,所以不用担心参数问题。...其中Action委托无返回值,属于Void类型,Func委托具有返回值,如Func,在Linq操作中比较常见,在该例中,无返回值的必要,故采用Action委托,由于需要处理转换失败的操作
三、泛型委托类型 在一些情况下我们不确定参数类型和返回值类型,这时我们就需要用到泛型委托类型,语法如下: public delegate T DemoDelegate(T arg); 我们具体看一下例子...,例如: public delegate string DemoDelegate(T arg); public delegate T DemoDelegate(int arg); 使用泛型委托的好处是可以写出一组委托类型...四、Action 和 Func 1.Func Func是一个具有返回类型的方法,它的类型参数数量可以多达16个,其中包括0到多个输入类型参数和一个输出类型参数。...我们在Main函数中通过委托,控制台输出结果是 3、5、7 。这时我们就看出了使用 Func 和 Action 的优点了,我们不需要在外部显式的定义委托,比较方便。...例如被调用的方法参数是 Object 类型,但是提供的参数是 String 类型,这时程序不会报错,因为string 来自 object,string 比 object 更具体。
领取专属 10元无门槛券
手把手带您无忧上云