将来の読者のための更新: .NET 4 が登場するとLazyInit<T>
、CTP から名前Lazy<T>
が変更され、構造体からクラスに変更されるため、変更可能な構造体が問題になる理由の例を除いて、これはほとんど適用されません。気をつけないと。
Parallel Extensions June CTP で LazyInit を試してみましたが、次のコードは同じ Guid を 1000 回出力すると予想していましたが、代わりに 1000 の異なる Guid を出力しました。明らかに、LazyInit がどのように機能するかについて、ここで明らかな何かが欠けています。
using System;
using System.Diagnostics;
using System.Threading;
namespace TestApp
{
class Program
{
static void Main(string[] args)
{
for (int i=0; i < 1000; i++)
{
Console.WriteLine(TestClass.Instance.Id);
}
Console.Write("Press any key to continue:");
Console.ReadKey();
}
private class TestClass
{
private static readonly LazyInit<TestClass> _instance = new LazyInit<TestClass>(() => new TestClass(), LazyInitMode.EnsureSingleExecution);
public static TestClass Instance
{
get { return _instance.Value; }
}
private TestClass()
{
Debug.WriteLine("TestClass Constructor");
Id = Guid.NewGuid();
}
public Guid Id { get; private set; }
}
}
}