我的问题具体涉及从另一个类初始化具有某个值的属性的好处(或相反),而不仅仅是属性get
。
例如,这个实现是否正确:
public class Foo
{
public object Bar { get; }
public Foo()
{
Bar = OtherClass.Bar;
}
}
与此实施相比具有任何实际优势:
public class Foo
{
public object Bar { get => OtherClass.Bar; }
}
我问,因为在我看来,第二次实施更容易阅读,显然更简洁,但我不知道除了行数之外,两者之间是否存在任何可测量的差异。
我能找到的唯一类似问题是C# Is there any benefit to assigning class properties in the class constructor?,这不能回答我的问题。
答案 0 :(得分:2)
两种实现方式不同:
Foo
的值,直到调用OtherClass.Bar
的构造函数为止。如果Foo.Bar
稍后更改,OtherClass.Bar
的用户将无法看到它。Foo.Bar
属性时,第二个实现将从public object Bar => OtherClass.Bar;
为您提供当前对象。一旦您决定了您希望拥有的行为,只剩下两种选择中的一种。
注意: C#6允许您重写第二个示例,如下所示:
npm -v
npm -i
npm i
npm i npm-check-updates -g
ncu -u
All dependencies match the latest package versions :)
答案 1 :(得分:2)
存在差异。 get-only属性(A)执行以下操作:
在调用构造函数时复制值/引用。
保留该值/参考。
这意味着Foo将继续在施工时参考该物业价值的快照。
这也意味着Foo不会让OtherClass保持活着。
而lambda属性正在执行以下操作(B):
调用时取消引用OtherClass,并返回bar的当前值。
这意味着OtherClass将保持活跃状态。
这也意味着可以更改OtherClass,更改引用它的属性的所有值,而无需重新设置它们(或使它们只读)。
最后,最重要的是,这意味着财产的价值可以改变(即Bar的参考/价值)。
就差异而言,当您想要一个值的只读快照时使用A,当您想要一个可以改变的实时值时使用B.