I have a object with properties that are expensive to compute, so they are only calculated on first access and then cached.
private List notes;
In .NET 3.5 or earlier, what you have is a very standard practice, and a fine model.
(Although, I would suggest returning IList, or IEnumerable if possible, instead of List in your public API - List should be an implementation detail...)
In .NET 4, however, there is a simpler option here: Lazy
private Lazy> notes;
public IEnumerable Notes
{
get
{
return this.notes.Value;
}
}
// In constructor:
this.notes = new Lazy>(this.CalcNotes);