いくつかの静的プロパティを持つ静的クラスがあります。それらすべてを静的コンストラクターで初期化しましたが、それは無駄であり、必要に応じて各プロパティを遅延ロードする必要があることに気付きました。そこで、このタイプを使用してすべてのダーティな作業を行うように切り替えSystem.Lazy<T>
、私の場合、実行は常にシングルスレッドであったため、スレッドセーフ機能を使用しないように指示しました。
私は次のクラスに行き着きました:
public static class Queues
{
private static readonly Lazy<Queue> g_Parser = new Lazy<Queue>(() => new Queue(Config.ParserQueueName), false);
private static readonly Lazy<Queue> g_Distributor = new Lazy<Queue>(() => new Queue(Config.DistributorQueueName), false);
private static readonly Lazy<Queue> g_ConsumerAdapter = new Lazy<Queue>(() => new Queue(Config.ConsumerAdaptorQueueName), false);
public static Queue Parser { get { return g_Parser.Value; } }
public static Queue Distributor { get { return g_Distributor.Value; } }
public static Queue ConsumerAdapter { get { return g_ConsumerAdapter.Value; } }
}
デバッグしているときに、今まで見たことのないメッセージに気づきました。
関数の評価では、すべてのスレッドを実行する必要があります
を使用する前Lazy<T>
は、値が直接表示されていました。次に、スレッドアイコンの付いた丸いボタンをクリックして、遅延値を評価する必要があります。.Value
これは、のを取得している私のプロパティでのみ発生しますLazy<T>
。Lazy<T>
実際のオブジェクトのデバッガビジュアライザーノードを展開すると、プロパティはメッセージなしでValue
単に表示されます。null
そのメッセージは何を意味し、私の場合はなぜ表示されるのですか?