I have a object with properties that are expensive to compute, so they are only calculated on first access and then cached.
private List<Note> notes;
public List<Note> Notes
{
get
{
if (this.notes == null)
{
this.notes = CalcNotes();
}
return this.notes;
}
}
I wonder, is there a better way to do this? Is it somehow possible to create a Cached Property or something like that in C#?
As far as syntax goes, you can use the null-coalescing operator if you want to be fancy, but it's not necessarily as readable.
get
{
return notes ?? (notes = CalcNotes());
}
Edit: Updated courtesy of Matthew. Also, I think the other answers are more helpful to the question asker!
In .NET 3.5 or earlier, what you have is a very standard practice, and a fine model.
(Although, I would suggest returning IList<T>
, or IEnumerable<T>
if possible, instead of List<T>
in your public API - List<T>
should be an implementation detail...)
In .NET 4, however, there is a simpler option here: Lazy<T>
. This lets you do:
private Lazy<IList<Note>> notes;
public IEnumerable<Note> Notes
{
get
{
return this.notes.Value;
}
}
// In constructor:
this.notes = new Lazy<IList<Note>>(this.CalcNotes);
Looks pretty standard to me. What you are doing is fine.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With