using System;
using System.Linq;
class Sample
{
public int SampleValue { get; set; }
public Sample()
{
Console.WriteLine("constructor called");
}
}
class SampleFrame : Lazy<Sample>
{
public int Id { get; set; }
}
class Program
{
static void Main(string[] args)
{
const int count = 1000;
var ar = new SampleFrame[count];
for (int i = 0; i < count; i++)
{
ar[i] = new SampleFrame() { Id = i };
}
Console.WriteLine(ar.Where(c => c.Id == 999).First().Value.SampleValue);
}
}
SampleFrameクラスのインスタンスは確かに1000個作成されています。ところが、Sampleクラスのコンストラクタは実際にアクセスされた1個分しか走っていません。999個分は走っていません。SampleFrameクラスのインスタンスのメンバーにアクセスしていても、それでコンストラクターは走りません。しかし、Value経由でアクセスすると作成されます。