use*_*963 2 c# system.reactive
Reactive Extensions有一个Observable.Start()功能.
Visual Studio告诉我它
通过可观察的序列异步调用结果.
它有返回类型 IObservable<Unit>
MDSN所说的Unit就是它
代表无效.
但为什么我需要代表void?
Reactive Extensions(或Rx)在函数式编程中非常强大,函数式编程要求每个运算符都返回一个值.
在命令式语言中,如C#,情况并非如此.我们可以定义没有返回类型的方法void Foo() { ... }.在非函数式语言中,这很好,当我们调用时,Foo()我们期望它做它做的任何事情并让它将控制权交还给我们.
在函数式语言中,我们可以调用void方法,因为我们需要一切都有返回类型.因此,为了使Rx具有功能性,我们需要一个特殊的返回类型来表示void,但我们不能使用void甚至实际的类型System.Void,因为编译器不允许它作为返回类型.因此,System.Reactive.Unit作为指示返回值的特殊类型void.
由于observable都基于IObservable<T>(没有IObservable没有T),你必须在调用时有一个返回类型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#中专门使用的位置.事实上,有很多Rx端口与其他语言相比,我认为不会有这样的用法,你要求的.你能澄清一下你在问什么吗?
有一个问题链接询问在哪里
Parallel.ForEach(IObservable<T>, Action<T>).在答案中,IObservable用ToList()和查询First().如果它的唯一目的是改变某些东西,这对我来说没有多大意义.
的.ToList()操作者打开一个IObservable<T>返回零点或更多的值成一个IObservable<IList<T>>返回一个值(一旦源可观察到的完成).所以以下.First()只是变成了IObservable<IList<T>>一个IList<T>.
链接的答案已经使用它来强制执行observable并阻塞直到observable完成.请记住,observable具有与枚举相同的延迟执行模型.
在函数式语言中,
Unit是纯函数范式和真实单词应用程序之间的折衷.它在C#中的用途是什么,从来没有纯粹的功能?
无论C#的功能是多么纯粹,该类型Unit用于允许observables,它必须是强类型并返回零或更多值,以具有指示没有有意义的返回类型的类型.
它与EventArgs带有签名的事件处理程序非常相似void Foo(object sender, EventArgs e)- 当事件触发时你知道发生了什么事,但是你没有得到任何信息e.Unit从可观察量中获取值非常类似于EventArgs在事件处理程序中获取.