Автоматические свойства являются просто синтаксическим сахаром для общего шаблона свойства, которое выполняет прямое чтение и запись в вспомогательное поле без какой-либо другой логики.
Если вы хотите выполнить отложенную загрузку, вам нужна либо вторая форма, которую вы даете, либо более сложная версия первой формы, которую вы даете, либо:
private Lazy<Color> _color = new Lazy<Color>(() => new Color("red"));
public Color MyColor
{
get
{
return _color.Value;
}
}
Что в этом случае просто сложнее, но в некоторых других случаях проще.
Существуют варианты шаблона отложенной загрузки, которые либо игнорируют проблемы безопасности adad (ваши это делает), которые в зависимости от нескольких вещей могут все еще быть поточно-ориентированными (это зависит от того, является ли это проблемой для множественного числа Color
творения должны произойти, а некоторые будут перезаписаны до тех пор, пока один из них не «выиграет», и часто это не проблема, хотя это то, что вам нужно учитывать, если может быть несколько одновременных вызовов), чтобы разрешить несколько вызовов на конструктор, но убедитесь, что только один из них «выигрывает» и становится используемым значением, или чтобы разрешить только один вызов.
Эти три варианта или увеличения стоимости в случае, когда существует только один поток, но повышение безопасности и снижение стоимости, если у вас много одновременных вызовов, поэтому каждый из трех имеет свое место.
public Color MyColor
{
get
{
if(_color == null)
{
var c = new Color("red");//allow multiple creations but...
Interlocked.CompareExchange(ref _color, c, null);//only one write
}
return _color;
}
}
public Color MyColor
{
get
{
if(_color == null)
lock(somelock)
if(_color == null)
_color = new Color("red");//allow one creation only
return _color;
}
}
С Lazy<Color>
существует форма конструктора, которая принимает значение LazyThreadSafetyMode
, указывающее, какой подход вы хотите.