Это, похоже, не использует Lazy<T>
с целью сохранить создание / загрузку дорогого объекта настолько, насколько это (возможно, непреднамеренно) обернуть некоторый произвольный делегат для отложенного выполнения.Вероятно, вы хотите / намереваетесь вернуть получатели полученного свойства string
, а не Lazy<string>
объект.
Если вызывающий код выглядит как
string fileName = MicrosoftFormatName.Value;
, то, очевидно, существуетне имеет смысла, так как вы немедленно «Ленивая загрузка».
Если вызывающий код выглядит как
var lazyName = MicrosoftFormatName; // Not yet evaluated
// some other stuff, maybe changing the value of DatFileName
string fileName2 = lazyName.Value;
, то вы можете увидеть, что есть вероятность, что fileName2
не будет определенкогда создается объект lazyName
.
Мне кажется, что Lazy<T>
не лучше всего использовать для открытых свойств;здесь ваши геттеры возвращают новые (как в совершенно новых, отличных, дополнительных) Lazy<string>
объектах, поэтому каждый вызывающий (потенциально) получит разных .Value
!Все ваши свойства Lazy<string>
зависят от того, установлен ли DatFileName
в момент первого обращения к их .Value
, поэтому вам будет всегда нужно думать о том, когда он инициализируется относительно использования каждого изпроизводные свойства.
См. статью MSDN " Ленивая инициализация ", в которой создается закрытая Lazy<T>
вспомогательная переменная и метод получения открытого свойства, который выглядит следующим образом:
get { return _privateLazyObject.Value; }
Что я могу предположить, что ваш код должен / может понравиться, используя Lazy<string>
для определения вашего базового свойства "set-Once":
// This is set up once (durinig object initialization) and
// evaluated once (the first time _datFileName.Value is accessed)
private Lazy<string> _datFileName = new Lazy<string>(() =>
{
string filename = null;
//Insert initialization code here to determine filename
return filename;
});
// The other 3 properties are derived from this one.
// Ends in .dat
public string DatFileName
{
get { return _datFileName.Value; }
private set { _datFileName = new Lazy<string>(() => value); }
}
private string DatFileBase
{
get { return Path.GetFileNameWithoutExtension(DatFileName); }
}
public string MicrosoftFormatName
{
get { return DatFileBase + "_m.fmt"; }
}
public string OracleFormatName
{
get { return DatFileBase + "_o.fmt"; }
}