响应式(Reactive)扩展有一个 Observable.Start()
功能。
Visual Studio 告诉我它
Invokes the action asynchronously surfacing the result through an observable sequence.
它有返回类型 IObservable<Unit>
所有 MDSN 都提到了 Unit
是吗
Represents void.
但是为什么我需要代表void
?
最佳答案
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 withToList()
andFirst()
. 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/