C#的委托(Action、Func、delegate、predicate) 末蓝、 2022-12-01 12:29 195阅读 0赞 ## 委托是什么?如何使用? ## **委托是一种类,类是数据类型所以委托也是一种数据类型,它的声明方式与一般的类不同,主要是为了照顾可读性和C/C++,委托使用要慎之又慎** C\#有已经定义好的两种委托方式,一个是**Action**,一个是**Func**,Action是无返回值的,而Func是要求有返回值的,两者都通过泛型定义好了参数类型,上限为16个。详细用法如下代码所示。此外还有predicate,返回值为bool类型。 此外C\#中还有自定义的委托,需要使用**delegate**关键字来定义 需要注意声明委托的位置,因为委托也是一种类,所以声明位置应当是与命名空间下,与其他类同级 委托与所封装的方法必须类型兼容,即返回值的数据类型一致,参数列表在个数和数据类型上一致(参数名不需要一样),具体代码如下所示。 delegate int delegateMethod(int x,int y ); class Program { static void Main(string[] args) { Calculator cal = new Calculator(); delegateMethod dm = new delegateMethod(cal.Add); int a = 1; int b = 2; int c = 0; c = dm(a,b); Console.WriteLine(c); Action action = new Action(cal.report); Action<int, int> actiondetail = new Action<int, int>(cal.reportdetail); Func<int, int, int> func = new Func<int, int, int>(cal.Add); action(); actiondetail(a, b); c = func(a, b); Console.WriteLine(c); } public class Calculator { public int Add(int x,int y) { return x + y; } public int Sub(int x,int y) { return x - y; } public void report() { Console.WriteLine("this is a calculator"); } public void reportdetail(int x,int y) { Console.WriteLine("process "+x+"+"+y+" is calculating..."); } } ## 委托的一般使用(把方法当作参数传给另一个方法) ## 1.借用指定的外部方法来产生结果(委托有返回值),如下例中委托func1和func2来调用产品工厂productFactory中的制造产品方法 2.调用指定的外部方法\[回调\](委托没有返回值),如下例中当产品被包装时,由于触发价格判断,调用logger打出此时的商品详情。 using System; using System.Collections.Generic; using System.Text; namespace Helloworld { class DelegateExample { static void Main(string[] args) { ProductFactory productFactory = new ProductFactory(); WrapFactoy wrapFactoy = new WrapFactoy(); Func<Product> func1 = new Func<Product>(productFactory.MakePizza); Func<Product> func2 = new Func<Product>(productFactory.MakeToy); Action<Product> action = new Action<Product>(new Logger().log); Box box1 = wrapFactoy.WrapProduct(func1,action); Box box2 = wrapFactoy.WrapProduct(func2,action); Console.WriteLine(box1.product.name); Console.WriteLine(box2.product.name); } } class Product { public string name { get; set; } public double price { get; set; } } class Logger { public void log(Product product) { Console.WriteLine("Product '{0}' created at {1}. Price is {2} ", product.name, DateTime.UtcNow, product.price); } } class Box { public Product product { get; set; } } class WrapFactoy { public Box WrapProduct(Func<Product> getProduct,Action<Product> action) { Box box = new Box(); Product product = getProduct(); if (product.price > 0) { action(product); } box.product = product; return box; } } class ProductFactory { public Product MakePizza() { Product product = new Product(); product.name = "Pizza"; product.price = 15; return product; } public Product MakeToy() { Product product = new Product(); product.name = "Toy"; product.price = 45; return product; } } }
相关 C#委托 一、什么是委托 委托是一种类型,就跟int,double,struct,string,class一样。它定义了一个函数的类型。现在,我们有一个方法,我们希望它的参数是某个 川长思鸟来/ 2024年02月17日 22:49/ 0 赞/ 64 阅读
相关 C#的委托 C\的委托是一种类型,它可以在不同的类之间传递方法。以下是一个精炼的代码注释示例来说明C\的委托: // 声明一个委托类型 delegate void MyD 太过爱你忘了你带给我的痛/ 2023年10月12日 17:28/ 0 赞/ 64 阅读
相关 C#——委托 C\——委托 委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。 在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联。 你可以通过委托 冷不防/ 2023年01月03日 04:22/ 0 赞/ 240 阅读
相关 C#委托 委托: 委托定义了方法的类型,使得方法可以作为另一个方法的参数来进行传递,这样可以在程序中避免使用大量的判断语句,同时使程序具有更好的扩展性。 可以将多个方法绑定到同一个委 矫情吗;*/ 2022年09月17日 07:28/ 0 赞/ 197 阅读
相关 c#委托 首先创建个控制台应用程序在Program下创建一个无参数无返回值的静态方法,可以输出一句话 static void Text() { Cons 迈不过友情╰/ 2022年04月16日 06:15/ 0 赞/ 258 阅读
相关 C# 委托 一、什么是委托? 初次理解这么抽象的概念确实有点挺难的,如果学过C语言,可能知道C语言里可以把一个方法当做参数来传递,委托大概类似也是这样一个原理。 想象一下,在一个 ゞ 浴缸里的玫瑰/ 2022年04月08日 12:15/ 0 赞/ 282 阅读
相关 C# 委托 什么是委托? 委托和事件这两个概念是完全配合的。委托仅仅是函数指针,那就是说,它能够引用函数,通过传递地址的机制完成。委托是一个类,当你对它实例化时,要提供一个引 野性酷女/ 2022年02月16日 13:51/ 0 赞/ 281 阅读
相关 C#中的委托 委托是类型安全和可靠的。 委托类似于 C++ 函数指针,但它是类型安全的。 (上面两句来自MSDN) C++的函数指针,也是类型安全(具有完全的签名:由返回类型和参数组成 朱雀/ 2021年12月05日 13:49/ 0 赞/ 340 阅读
相关 C# 委托 委托 作用:将多个参数相同的方法,进行委托统一调用,将参数和调用方法传递给委托,由委托调用。 好处:可以将多个方法内相同的部分提取出来,根据参数和方法参数,调用需要的 ゝ一世哀愁。/ 2021年10月14日 02:00/ 0 赞/ 384 阅读
相关 C# 委托 什么是委托? 委托是寻址方法的.NET版本,使用委托可以将方法作为参数进行传递。委托是一种特殊类型的对象,其特殊之处在于委托中包含的是一个或多个方法的地址,而不是数据。委 谁践踏了优雅/ 2021年06月24日 16:10/ 0 赞/ 500 阅读
还没有评论,来说两句吧...