4

拡張メソッド内でyield演算子を使用することはスレッドセーフでしょうか?

例えば:

public static IEnumerable<CartItem> GetItems( this Cart cart )
{
        {
            while( cart.hasNext() )
                yield return cart.GetNextItem( );
        }
}
4

1 に答える 1

3

正確にはわかりませんが、yield returnを使用すると、基本的に関数がステートマシンラッパークラスを生成し、クラスのインスタンスを返します。各イールドリターンは、ステートマシンからのリターンです。メソッドの呼び出しによって返される個々のインスタンスはスレッドセーフではありませんが(複数のスレッドから同時に反復することはできません)、複数の呼び出しによって別々のインスタンスが生成されます。これらの個別のインスタンスは複数のスレッドで使用される可能性があり、その場合のスレッドセーフは、列挙子(このcart場合はのメソッド)によって使用されるクラスのスレッドセーフによって決定されます。

于 2010-04-23T23:31:11.757 に答える