A common pattern for lazy-initialization of a possibly-expensive type is double-checked locking.
The pattern is essentially this:
// member field private volatile MyType myObject = null; private object myLock = new object(); public MyType MyObject { get { if (myObject == null) { lock(myLock) { if (myObject == null) { myObject = new MyType(); } } } } }
It’s quite common, and it’s also common to get it subtly wrong (not using volatile, for example).
However, in .Net 4, there’s a simpler way to do this: use Lazy<T>. This type uses a delegate to initialize the value with double-checked locking (there are other possible thread safety modes as well).
private Lazy<MyType> myObject = new Lazy<MyType>( () => new MyType ); public MyType MyObject { get { return myObject.Value; } }
With Lazy<T>, the delegate you pass in will not be called until the Value property is accessed. Depending on the options you set, only a single thread will call your delegate and create the real type. I’d much rather do this than have to look at double-checked locking patterns scattered throughout a code base.
Like this tip? Check out my book, C # 4.0 How-To, where you’ll finds hundreds of great tips like this one.