RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 667101
Accepted
Сергей
Сергей
Asked:2020-05-17 15:33:02 +0000 UTC2020-05-17 15:33:02 +0000 UTC 2020-05-17 15:33:02 +0000 UTC

为什么需要一个空的 Action<T> 委托

  • 772

在研究 lambda 表达式时,我遇到了 Action 和 Func 代表。为什么我需要第二个,我明白,至少是为了:

Func<int, int, int> summ = (x, y) => x + y;
Console.WriteLine(summ(10,20));

但是为什么你需要一个空的Action<T>还不清楚。

举一个简单的例子为什么可能需要它?例如,为什么你不能放入void和Func<T, TResult>得到相同的Action<T>种类 Func<int, void>?

c#
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Sergey Teplyakov
    2020-05-19T00:10:47Z2020-05-19T00:10:47Z

    有两个世界——纯函数式编程的世界和现实世界。

    在纯函数式编程的纯世界中,没有可变状态,也没有语句,一切都是表达式。在这个理想世界中,函数没有副作用,编程语言中的任何构造都是表达式(即返回结果)。

    但在现实世界中,情况有所不同。

    在现实世界中,尤其是在 C# 的世界中,有副作用,也有一种奇妙的类型Void,即不兼容其他类型的不常见类型。在这个世界上,一个动作 ( Action) 不能用一个函数 ( Func) 来表示,只是因为它是被Func<T, void>禁止的,而且没有类型Unit(类似于 type Void,但可以转换为泛型 type T)。如果不是这种情况,则以下代码将有效:

    Func<int, Unit> fun = n => System.Console.WriteLine(n);
    

    这并不意味着这个规则对于现实世界的所有语言都是通用的,甚至对于.NET 世界也是如此,但是对于 C# 来说是。同样的F#(一种更接近数学世界的语言)有类型Unit,可以自动将.NET转换为.NET Void,Unit这使得上面的代码有效。

    长话短说;博士;Func<int, void>由于历史原因被禁止(很遗憾),因为很多时候你必须隔离转换器,它将转换Func<T>为Action并丢弃结果。

    如果我们说的是真实场景,那么Action类型的适用性是没有问题的。

    • Parallel.For/ Parallel.ForEach:Parallel.For(0, list.Count, n => Console.WriteLine(list[n]);

    • 类似于前一个 -ActionBlock<T>并且应该由合理数量的线程执行的操作。

    • Task以及要异步执行的操作:var task = Task.Run(() => SomeOperation());

    • 用于日志记录和其他不返回任何内容的操作的各种回调。

    一般来说,void-return 函数的存在和普及决定了Action<T>. 好吧,我们应该尽量将副作用保持在一个合理的最小值,但在现实世界中,这个最小值永远不会变为 0。

    • 8

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5