Skip to content

Return

1. 概要

Return は、最も基本的なファクトリメソッドです。単一の値を発行し、即座に完了します。

TimeProviderTimeSpan を指定するオーバーロードを使うと、値の発行を非同期的に、または指定時間だけ遅延させることができます。

また、R3 では Unitboolint に対してボクシングを回避する最適化オーバーロードが用意されています。

2. シグネチャ

基本

csharp
public static Observable<T> Return<T>(T value)

指定した値を即座に発行し、完了します。最もシンプルな形式です。

csharp
Observable.Return(42)

遅延付き(TimeProvider)

csharp
public static Observable<T> Return<T>(T value, TimeProvider timeProvider, CancellationToken cancellationToken = default)
public static Observable<T> Return<T>(T value, TimeSpan dueTime, TimeProvider timeProvider, CancellationToken cancellationToken = default)

TimeProvider のみを指定した場合、値の発行が非同期的に行われます(タイミングは TimeProvider に委ねられます)。TimeSpan も指定すると、その時間だけ遅延してから値を発行します。

csharp
// 非同期的に発行
Observable.Return("hello", TimeProvider.System)

// 1 秒後に発行
Observable.Return("hello", TimeSpan.FromSeconds(1), TimeProvider.System)

型別最適化

csharp
public static Observable<Unit> Return(Unit value)
public static Observable<bool> Return(bool value)
public static Observable<int> Return(int value)

Unitboolint を直接受け取るオーバーロードです。ジェネリック版と異なり、ボクシングやアロケーションを回避するために内部的に最適化されています。

csharp
Observable.Return(Unit.Default)  // Unit 最適化
Observable.Return(true)          // bool 最適化
Observable.Return(100)           // int 最適化

オーバーロードの使い分け

overload使う場面
Return<T>(T)任意の型の値を即座に発行する
Return<T>(T, TimeProvider)非同期的に発行したい場合
Return<T>(T, TimeSpan, TimeProvider)指定時間だけ遅延して発行したい場合
Return(Unit) / Return(bool) / Return(int)よく使う型をアロケーションなしで発行する

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

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

Return は購読されると値 x を 1 つ発行し、直後に完了通知を送ります。遅延付きオーバーロードの場合は、指定した時間が経過してから同じ動作を行います。

4. サンプルコード

csharp
using R3;

// 基本: 単一の値を即座に発行
Observable.Return(42)
    .Subscribe(x => Console.WriteLine($"値: {x}"));
// 出力: 値: 42

// 遅延付き: 1 秒後に値を発行
Observable.Return("delayed", TimeSpan.FromSeconds(1), TimeProvider.System)
    .Subscribe(
        x => Console.WriteLine($"値: {x}"),
        _ => Console.WriteLine("完了"));
// 出力(1 秒後): 値: delayed
// 出力: 完了

// Unit 最適化: シグナルとして使用
Observable.Return(Unit.Default)
    .Subscribe(_ => Console.WriteLine("通知を受信"));
// 出力: 通知を受信

5. 補足

ReturnUnit との違い

ReturnUnitObservable.Return(Unit.Default) と同等ですが、引数なしで呼び出せるため、シグナル用途ではより簡潔に記述できます。

ReturnFrame との違い

時間ベースの遅延ではなく、フレーム単位の遅延が必要な場合(ゲームや UI フレームワーク向け)は ReturnFrame を使用してください。