Я бы использовал Lazy<T>
в целом:
- Это поточно-ориентированный (может не быть проблемой в этом случае, но будет в других)
- Это делает егоочевидно, что происходит только по имени
- . Это позволяет пустому значению быть допустимым
Обратите внимание, что у вас нет для использования лямбда-выражения дляделегат.Например, вот подход, который может быть немного чище:
public static class Brushes
{
private static readonly Lazy<LinearGradientBrush> _myBrush =
new Lazy<LinearGradientBrush>(CreateMyBrush);
private static LinearGradientBrush CreateMyBrush()
{
var linearGradientBrush = new LinearGradientBrush { ...};
linearGradientBrush.GradientStops.Add( ... );
linearGradientBrush.GradientStops.Add( ... );
return linearGradientBrush;
}
public static LinearGradientBrush MyBrush
{
get { return _myBrush.Value; }
}
}
Это особенно удобно, когда процесс создания усложняется циклами и т. Д. Обратите внимание, что по внешнему виду вы можете использовать инициализатор коллекции дляGradientStops
в вашем коде создания.
Другой вариант - , а не , чтобы делать это лениво, конечно ... если у вас нет нескольких таких свойств в вашем классе, и вы хотите создать толькосоответствующие объекты на индивидуальной основе, вы можете положиться на ленивую инициализацию класса для многих ситуаций.
Как отмечается в ответе DoubleDown, нет способа сбросить его для принудительного пересчета (если вы не сделаете поле Lazy<T>
не только для чтения) - но я очень редко обнаруживал, что это важно.