C# Lazy Loaded Automatic Properties
No there is not. Auto-implemented properties only function to implement the most basic of properties: backing field with getter and setter. It doesn't support this type of customization.
However you can use the 4.0 Lazy<T>
type to create this pattern
private Lazy<string> _someVariable =new Lazy<string>(SomeClass.IOnlyWantToCallYouOnce);
public string SomeVariable => _someVariable.Value;
This code will lazily calculate the value of _someVariable
the first time the Value
expression is called. It will only be calculated once and will cache the value for future uses of the Value
property
Probably the most concise you can get is to use the null-coalescing operator:
get { return _SomeVariable ?? (_SomeVariable = SomeClass.IOnlyWantToCallYouOnce()); }
There is a new feature in C#6 called Expression Bodied Auto-Properties, which allows you to write it a bit cleaner:
public class SomeClass
{
private Lazy<string> _someVariable = new Lazy<string>(SomeClass.IOnlyWantToCallYouOnce);
public string SomeVariable
{
get { return _someVariable.Value; }
}
}
Can now be written as:
public class SomeClass
{
private Lazy<string> _someVariable = new Lazy<string>(SomeClass.IOnlyWantToCallYouOnce);
public string SomeVariable => _someVariable.Value;
}