反应式扩展具有Observable.Start()
函数。
Visual Studio告诉我,它
通过可观察序列异步呈现结果调用操作。
它具有返回类型 IObservable<Unit>
MDSN关于Unit
所说的只是它
表示空。
但是为什么我需要代表void
?
为什么我需要将 void
的流转换为列表并从中获取第一个元素以替换并行 ForEach?
响应式扩展(或 Rx)非常强烈地基于函数式编程,函数式编程要求每个运算符返回一个值。
在命令式语言(如 C#)中,情况并非如此。我们可以定义没有返回类型的方法,例如 void Foo() { ... }
.在非函数式语言中,这很好,当我们调用Foo()
时,我们希望它做它所做的任何事情,并让它将控制权返回给我们。
在函数式语言中,我们可以调用void
方法,因为我们需要所有内容都具有返回类型。因此,为了使 Rx 正常运行,我们需要有一个表示 void
的特殊返回类型,但我们不能使用 void
甚至实际的类型 System.Void
,作为返回类型,因为编译器不允许它。因此,System.Reactive.Unit
作为特殊类型来指示返回的值为 void
。
由于可观察量都是基于IObservable<T>
的(没有T
就没有IObservable
),因此在调用Observable.Start(Action)
时必须具有返回类型。因此,我们有IObservable<Unit>
.
我不明白你的意思,"为什么我需要将一股空隙流转换为列表并从中获取第一个元素来替换并行 ForEach?
为什么不
void Start(IObservable<T>, Action<T>)
?
那个签名对我来说没有意义。如果您有Action<T>
则应用的Observable.Start
重载IObservable<T> Observable.Start(Action<T>)
。如果它是Action
(这是您问题的主题),那么它是IObservable<Unit> Observable.Start(Action)
.
是否有在 C# 中使用 Unit 的示例,而不是其他语言?
这也是一个我觉得很难理解的问题。我不可能足够详细地了解所有其他语言来告诉您 C# 中专门使用 Unit
的位置。事实上,Rx到其他语言的端口太多了,我认为不会有你要求的用法。你能澄清一下你在问什么吗?
有一个问题链接,询问
Parallel.ForEach(IObservable<T>, Action<T>)
在哪里。而在答案中,IObservable是用ToList()
和First()
查询的。如果它的唯一目的是变异某些东西,这对我来说没有多大意义。
.ToList()
运算符将返回零个或多个值的IObservable<T>
转换为返回一个值的IObservable<IList<T>>
(一旦源可观察量完成)。所以下面的.First()
只是把IObservable<IList<T>>
变成了IList<T>
.
链接答案已使用它来强制执行可观察量并阻止,直到可观察量完成。请记住,可观察量与可枚举量具有相同的延迟执行模型。
无论在函数式语言中,
Unit
是纯函数式范式和真实单词应用程序之间的折衷。它在 C# 中的目的是什么,它从来都不是纯粹的功能?
C# 是否具有纯函数性,类型 Unit
都用于允许可观察量(必须是强类型并返回零个或多个值)具有指示没有有意义的返回类型的类型。
它与具有签名void Foo(object sender, EventArgs e)
的事件处理程序EventArgs
非常相似 - 当事件触发时,您知道发生了什么事,但您没有从e
获得任何信息。从可观察量获取 Unit
值非常类似于在事件处理程序中获取EventArgs
。