Ну, на самом деле, нет, они не отличаются.
Но, и это только предположение, заметьте, они тоже не работают, по крайней мере, не так, как я надеюсь, вы хотели, чтобы они это делали.
Видите, этот синтаксис:
<property declaration> = <expression>;
Объявляет инициализатор для свойства, которое будет выполнено при построении типа-владельца.
Итак, это:
private static readonly Lazy<Foo> instance = new Lazy<Foo>();
public static Foo Instance { get; } = instance.Value;
совсем не ленивый.Он объявит и создаст Lazy<Foo>
(хотя вы, возможно, и здесь пропускаете делегат-получатель, даже если он компилируется), однако, когда вы объявляете свойство, вы в конечном итоге получаете свойство, оценивающее ленивый объект при построении типа-владельца.и, таким образом, он становится ленивым.
Второй имеет ту же самую проблему, вы создаете и сразу оцениваете ленивый объект, чтобы он стал ленивым.
Правильный путь, и этоможет быть достигнуто только в виде первой синтаксической формы, это использовать свойство без инициализатора, либо это:
private static readonly Lazy<Foo> instance = new Lazy<Foo>();
public static Foo Instance
{
get { return instance.Value; }
}
или это:
private static readonly Lazy<Foo> instance = new Lazy<Foo>();
public static Foo Instance
{
get => instance.Value;
}
или, вероятно, лучше, какthis:
private static readonly Lazy<Foo> instance = new Lazy<Foo>();
public static Foo Instance => instance.Value;
Это объявит метод получения body , который не будет выполняться до тех пор, пока вы действительно не прочитаете свойство.
TL; DR Подводя итог, приведенные вами два примера не отличаются, но оба они (вероятно) неверны, и вам нужно изменить объявление свойства, чтобы исправить это.