c# - Action 的结果是什么?我该如何使用它?

标签 c# system.reactive

响应式(Reactive)扩展有一个 Observable.Start()功能。

Visual Studio 告诉我它

Invokes the action asynchronously surfacing the result through an observable sequence.

它有返回类型 IObservable<Unit>

所有 MDSN 都提到了 Unit是吗

Represents void.

但是为什么我需要代表void

为什么我 need to convert a stream of void s to list and take first element from it to replace parallel ForEach

最佳答案

Reactive Extensions(或 Rx)非常依赖于函数式编程,而函数式编程要求每个运算符都返回一个值。

在 C# 等命令式语言中,情况并非如此。我们可以定义没有返回类型的方法,如 void Foo() { ... } .在非函数式语言中这很好,当我们调用 Foo() 时我们期望它做任何它做的事,并将控制权交还给我们。

在函数式语言中我们可以调用void方法,因为我们需要所有东西都有一个返回类型。因此,为了让 Rx 发挥作用,我们需要一个特殊的返回类型来表示 void。 , 但我们不能使用 void甚至实际类型 System.Void ,作为返回类型,因为编译器不允许它。所以进来 System.Reactive.Unit作为特殊类型表示返回值为 void .

而且由于可观察对象都基于 IObservable<T> (没有 IObservable 就没有 T )调用时必须有返回类型 Observable.Start(Action) .因此我们有IObservable<Unit> .

我不明白你的意思,“为什么我需要将空流转换为列表并从中取出第一个元素来替换并行 ForEach?”


Why not void Start(IObservable<T>, Action<T>)?

那个签名对我来说没有意义。如果你有 Action<T>然后 Observable.Start 的过载适用的是 IObservable<T> Observable.Start(Action<T>) .如果是Action (这是你的问题的主题)那么它是 IObservable<Unit> Observable.Start(Action) .

Are there examples where Unit is used in C#, not some other languages?

这也是我比较难理解的问题。我不可能足够详细地了解所有其他语言来告诉你在哪里 Unit专用于 C#。事实上,Rx 到其他语言的端口太多,我认为不会有您要求的这种用法。你能澄清你的问题吗?

There is a question linked asking where is Parallel.ForEach(IObservable<T>, Action<T>). And in the answer, IObservable is queried with ToList() and First(). Which doesn't make a lot of sense for me if its only purpose is to mutate something.

.ToList()运算符(operator)转动 IObservable<T>将零个或多个值返回到 IObservable<IList<T>>返回一个值(一旦源可观察完成)。所以下面.First()只需转动 IObservable<IList<T>>进入 IList<T> .

链接的答案已使用它来强制执行可观察对象并阻塞直到可观察对象完成。请记住,可观察对象与可枚举对象具有相同的延迟执行模型。

In functional languages, Unit is a compromise between pure functional paradigm and real word applications. What is its purpose in C#, which has never been purely functional?

不管 C# 是不是纯函数式的,类型 Unit用于允许必须是强类型并返回零个或多个值的可观察对象具有指示无意义返回类型的类型。

它与 EventArgs 非常相似带有签名的事件处理程序 void Foo(object sender, EventArgs e) - 当事件触发时,您知道发生了什么,但是您从e 中得不到任何信息。 .获取 Unit 的值从 observable 得到一个 EventArgs 非常像在事件处理程序中。

关于c# - Action 的结果是什么?我该如何使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34946743/

相关文章:

java - 我如何将来自不同 observable 的 rx.Observable 搜索结果合并到一个 Observable 中?

c# - ExtractIconEx nIconIndex 参数的正确用法?

c# - 使用 Reactive Extensions、嵌套订阅按组缓冲

observablecollection - 重大更改破坏了 Rx 示例

android - 为什么 Observable 没有在正确的线程上创建?

scala - 如何在 fs2 Functional Stream for Scala 中创建离散流?

c# - 单步执行我的程序时,无缘无故地调用 ToString() 方法

c# - 如何将 SQL "WHERE expr IN (query)"翻译成 LINQ?

c# - 为什么 id 在某些默认 MVC 操作上可以为空?

c# - 在 C# 4.0 中实现 IEnumerable