Skip to content

Share

1. 概要

Share は、ソース Observable を自動的にホットシーケンスとして複数の購読者で共有するオペレーターです。最初の購読者が購読したときにソースへの接続を開始し、最後の購読者が購読を解除したときにソースの接続を切断します。内部的には source.Publish().RefCount() と同等の動作をします。

2. シグネチャ

デフォルト

csharp
public static Observable<T> Share<T>(
    this Observable<T> source)

ソースを複数の購読者で共有する Observable を返します。購読者の参照カウントに基づいてソースへの接続を自動管理します。

3. マーブルダイアグラム

Share のマーブルダイアグラム

最初の購読者がソースへの接続をトリガーし、以降の購読者は同じストリームを受信します。最後の購読者が解除されるとソースの接続が切断されます。

4. サンプルコード

csharp
// 重い処理を含むソースを共有
var shared = expensiveObservable.Share();

// 複数の購読者がソースを共有
var sub1 = shared.Subscribe(x => Console.WriteLine($"購読者1: {x}"));
var sub2 = shared.Subscribe(x => Console.WriteLine($"購読者2: {x}"));

// 両方の購読者が同じ値を受け取る

// 一方を解除しても、もう一方が購読中ならソースは継続
sub1.Dispose();

// 最後の購読者が解除されるとソースの接続も切断
sub2.Dispose();

// 再度購読するとソースに再接続
var sub3 = shared.Subscribe(x => Console.WriteLine($"購読者3: {x}"));

5. 補足

PublishConnectableObservable を返し、Connect() を手動で呼び出すことで接続タイミングを制御できます。一方、Share は自動的に接続・切断を管理するため、ほとんどのユースケースで最もシンプルなホット共有の方法です。

Share()Publish().RefCount() と同じ用途のショートカットです。Publish() でソースを共有可能な ConnectableObservable に変換し、RefCount() で最初の購読者による自動接続と最後の購読解除による自動切断を追加したもの、と考えると理解しやすくなります。手動で Connect() を呼びたい場合だけ Publish を直接使用してください。

過去の値を新しい購読者に再生する必要がある場合は Replay を使用してください。Share は過去の値をバッファリングしません。