変更可能な整数を渡す必要があるイテレータを作成しています。イテレータに渡す値型の変更可能なラッパー
public IEnumerable<T> Foo(ref int valueThatMeansSomething)
{
// Stuff
yield return ...;
}
これは私のネット "エラー476のイテレータは、refまたはoutパラメータを持つことができません"。
私が必要とするのは、この整数値がイテレータで変更され、イテレータの呼び出し側が使用できることです。言い換えれば、上記のFoo()
の呼び出しがvalueThatMeansSomething
とFoo()
という最終値を知りたければ、それ自体を使用することができます。実際、値の型ではなく参照型の整数が必要です。
私が考えることができるのは、私の整数をカプセル化し、それを変更できるクラスを書くことだけです。
だから、public class ValueWrapper<T>
where T : struct
{
public ValueWrapper(T item)
{
this.Item = item;
}
public T Item { get; set; }
}
:
ValueWrapper<int> w = new ValueWrapper<int>(0);
foreach(T item in Foo(w))
{
// Do stuff
}
if (w.Item < 0) { /* Do stuff */ }
BCLで、すでにこれを処理する任意のクラスやメカニズムはありますか?上記のValueWrapper<T>
の瑕疵はありますか?
(私の実際の使用はそれほどオプションではありませんFoo()
を呼び出して、私のforeach
ループ内の変数を扱う上記の例よりも複雑である。期間。)
フィールドのvolatileは、任意の値型への書き込みがC#仕様でアトミックであることが保証されていないため、スレッドの安全性を保証するには不十分です。揮発性はアトミック性を保証するものではなく、単にコンパイラ最適化による順序付けの問題を取り除くだけです。 –
スレッドの安全性が気になる場合は、ロックを使用してください。 –
@エリック:うん、良い点。私はもともと原子性を保証していると書いていましたが、それはすぐに削除しました。 – Noldorin