热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#学习教程:C#中的委托与行动有什么区别?分享

C#中的委托与行动有什么区别?如果我搜索过,我肯定会得到一个显示什么是代表和行动的例子。我已经阅读了基本书籍,给出了代表的例子。但我想知道的是它们在现实世界中的用途。请不要给Hel

C#中的委托与行动有什么区别?

如果我搜索过,我肯定会得到一个显示什么是代表和行动的例子。 我已经阅读了基本书籍,给出了代表的例子。

但我想知道的是它们在现实世界中的用途。 请不要给Hello World示例或动物类它们太基本了

例如:

  1. 它们之间有什么区别
  2. 何时使用委托或行动
  3. 何时不使用代表或行动
  4. 当他们可以过度杀戮

Action Delegate 。 它的定义如下:

 public delegate void Action(); 

您可以创建自己的委托类型,类似于创建抽象方法的方式; 你写签名但没有实现。 然后,您可以通过引用方法来创建这些委托的实例。

 class Program { public static void FooMethod() { Console.WriteLine("Called foo"); } static void Main() { Action foo = FooMethod; // foo now references FooMethod() foo(); // outputs "Called foo" } } 

定义委托时,实质上是定义方法的签名(返回类型和参数)。

Action是一个已经定义的委托(void return和no args)。

 public delegate void Action() 

你可以去定义并亲自看看。 或者在文档中。 http://msdn.microsoft.com/en-us/library/system.action.aspx

当我正在寻找的方法的签名与支持的签名匹配时,我几乎总是使用现有的通用委托(其中一个操作是一个)。 使用generics代理的一个好处是它们是众所周知的。 大多数开发人员都知道动作无效/无效。 如果我要定义自己的Action版本,每个人都需要查找它的签名,我只是复制已存在的东西。

例如……由于void / void方法的目的只能用于变异,因此动作恰好有点罕见。 Func非常常见(也是通用委托)。 它在整个框架中都有使用的例子,特别是在linq中。 比如看看。的地方。 http://msdn.microsoft.com/en-us/library/bb534803.aspx 。 它是一个Func意味着它将您正在处理的集合类型的元素作为参数并返回一个bool。 在具有Func返回true的where语句的上下文中,意味着将其包含在结果中,反之亦然。

 public static IEnumerable Where( this IEnumerable source, Func predicate ) 

由于Kenneth&Siege已经指出了代码和MSDN,我将尝试填写现实世界的例子。

考虑一个定义“移动”的委托。

现实世界中的“行动”代表将是“跑步”或“行走”。 你不关心你移动的速度,你走的路线或报告移动的时间。

例如,非Action代理可以定义您运行的速度并返回完成它所花费的时间。

 public delegate void MoveAction(); public delegate int MoveDelegate(int speed); 

扩展围攻的例子..

 class Program { public static void Run() { Console.WriteLine("Running"); } public static int RunAtSpeed(int speed) { // logic to run @ speed and return time Console.WriteLine("Running @ {0}", speed); return 10; } public static int WalkAtSpeed(int speed) { // logic to walk @ speed and return time Console.WriteLine("Walking @ {0}", speed); return 20; } static void Main() { Action foo = Run; foo(); MoveDelegate run = RunAtSpeed; int result1 = run(5); MoveDelegate walk = WalkAtSpeed; int result2 = walk(1); } } 

什么是Action:相当简单的Action,Func <>,谓词都属于委托类型。

我们为什么需要Action: Action封装了不同数量的参数和不同类型的返回类型,这些类型足以满足应用程序开发的需要。 这些在System命名空间中提供。 您可以自由创建自己的代理。

请注意,有17种不同类型的Action和Func,每种类型都有0到16个参数化通用参数。

动作始终没有返回值。 Func具有单个参数化generics返回类型。

恕我直言, Predicate委托不需要被定义为它真正等同于Func,它接受一个arg并返回bool。

已经反复请求的真实世界示例代码已在“Console.WriteLine”用户的早期答案中提供。

至于为什么提供它,从我的理解,行动是一种方法来节省定义自己的新代表。 由于它是特定签名类型的预定义委托,因此可以节省为每个预期目的创建不同委托的麻烦。 您只需使用预定义的Action委托指向您的方法并运行它们。 Func委托的情况也是如此。

更多的是方便,而不是实际的新function。 帮助您保持代码简短易懂,减少麻烦。

至于你的观点问题,

  1. 它们之间有什么区别

没有不同。 Action是一个预定义的委托,旨在为您省去重复定义新委托的麻烦。

  1. 何时使用委托或行动

通常,委托(和操作)用于需要具有表驱动function的位置。 即,可能是对应于某些特定要求的方法的字典。 请注意,在此处使用Action可以轻松更改调用的最终方法,以动态指向其他方法(可能基于用户选择的某些设置?)


 class Program { static void Main() { Dictionary dict = new Dictionary(); dict["loadFile"] = new Action(LoadFile); dict["saveFile"] = new Action(SaveFile); dict["loadFile"].Invoke(); dict["saveFile"].Invoke(); } static void SaveFile() { Console.WriteLine("File saved!"); } static void LoadFile() { Console.WriteLine("Loading File..."); } } 

另一种典型用法是回调方法。 示例是您使用BubbleSort类的地方,将比较器方法作为委托传递给类,BubbleSort类将使用它来允许您的代码定义比较逻辑,同时处理其他所有事情。 这也可以从您已启动的线程中使用,并且线程在需要将某些中间操作通知您的代码时调用该委托。

您可以参考这篇SOpost,看看上面的一个很好的例子。 https://stackoverflow.com/a/3794229/1336068

  1. 何时不使用代表或行动

我认为在情况需要时不使用它们的唯一原因是,如果你的代表将在短时间内被召唤数百万次。 涉及到一个轻微的开销,如果这导致应用程序滞后,那么您可能必须找到一种更好的方法来解决这个问题,使用直接引用您的函数,而不是通过委托。

  1. 当他们可以过度杀戮

当你无偿地使用它们时,没有任何实际需要。 否则,在大多数情况下,它们可以是解决上述场景的优雅方式。

另外,请阅读此SO答案以了解正常方法之间的区别,委托以更好地了解使用委托/ action / func的位置https://stackoverflow.com/a/17380580/1336068

上述就是C#学习教程:C#中的委托与行动有什么区别?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注&#8212;编程笔记


推荐阅读
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
author-avatar
坐着驴车追宝马
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有