C# 什么';s source.StartWith(x).Replay(1)和source.Publish(x)之间的差异

C# 什么';s source.StartWith(x).Replay(1)和source.Publish(x)之间的差异,c#,.net,system.reactive,C#,.net,System.reactive,给定一个序列,IObservable源,两者之间是否存在差异: var published = source.Publish(0); var publishedConnection = published.Connect(); 及 据我所知,他们非常相似。它们都有一个默认值为零,订阅时,观察者将立即从源接收最后一个值,并将源的所有其他值推送到订阅服务器 我有一个模糊的线索,我在某处读到(我现在找不到)如果source要完成,published不会将任何值传递给新订阅者,而是立即完成,而repl

给定一个序列,
IObservable源,两者之间是否存在差异:

var published = source.Publish(0);
var publishedConnection = published.Connect();

据我所知,他们非常相似。它们都有一个默认值为零,订阅时,观察者将立即从
接收最后一个值,并将
的所有其他值推送到订阅服务器

我有一个模糊的线索,我在某处读到(我现在找不到)如果
source
要完成,
published
不会将任何值传递给新订阅者,而是立即完成,而
replayed
仍会在完成之前将最后一个值重播给新订阅者


我是否正确地记住了这一点(任何人都能找到这样的来源),这两种方法之间还有什么区别吗?

您列出的区别是准确的<代码>重播
重播,而
发布
只是发布。我写了五行代码来检查这一点。没有其他显著差异。源代码也可以在上找到,尽管我承认对于那些不熟悉它的人来说,它不容易破译

代码:


尽管您知道这是一个技术细节,但可能值得注意的是,这些操作符之间的主要区别在于它们的用途:问题中的
Publish
的特定重载设计用于隐藏
行为主体
,而
Replay
设计用于隐藏
ReplaySubject
var replayed = source.StartWith(0).Replay(1);
var replayedConnection = replayed.Connect();
var source = Observable.Return(1);

// comment out as appropriate:
// this gives no output
var conn = source.Publish(0);
// this gives 1
var conn = source.StartWith(0).Replay(1);

conn.Connect();

conn.Subscribe(Console.WriteLine);