返回另一个类的成员而不是在构造函数中设置属性的属性是否有任何好处?

时间:2018-01-11 15:53:27

标签: c# constructor properties

我的问题具体涉及从另一个类初始化具有某个值的属性的好处(或相反),而不仅仅是属性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?,这不能回答我的问题。

2 个答案:

答案 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)执行以下操作:

  1. 在调用构造函数时复制值/引用。

  2. 保留该值/参考。

  3. 这意味着Foo将继续在施工时参考该物业价值的快照。

  4. 这也意味着Foo不会让OtherClass保持活着。

  5. 而lambda属性正在执行以下操作(B):

    1. 调用时取消引用OtherClass,并返回bar的当前值。

    2. 这意味着OtherClass将保持活跃状态​​。

    3. 这也意味着可以更改OtherClass,更改引用它的属性的所有值,而无需重新设置它们(或使它们只读)。

    4. 最后,最重要的是,这意味着财产的价值可以改变(即Bar的参考/价值)。

    5. 就差异而言,当您想要一个值的只读快照时使用A,当您想要一个可以改变的实时值时使用B.