如何设置属性对象的初始化顺序?

How to set initialization order for a properties object?

例如:假设我有

    private double foo;
    private double bar;

    public double foo
    {
        get { return foo; }
        set
        {
            foo = value;
        }
    }

    public double bar
    {
        get { return bar; }
        set
        {
            
            bar = value * foo ;
        }
    }

初始化此对象时,我想设置顺序,即有人首先将值设置为 foo,然后将值设置为 bar。我知道如果 foo 没有在 bar 中初始化,我可以抛出一个异常,但是有没有办法设置这个要求,这样无论谁实例化这个属性对象,都不会有任何问题开始?

我认为 public setter 在这种特殊情况下不合适。我建议改用构造函数:

public MyClass(double foo, double value) => (Foo, Bar) = (foo, value*foo);
public double Foo {get; private set;}
public double Bar {get; private set;}

请注意,我没有调用参数 bar,因为这会导致期望 Bar-属性 应该具有 bar 的值参数.

如果您愿意,您可以选择给 Bar 一个默认值。但一般来说,构造函数应该确保类型被完全构造,所以任何需要的属性都应该作为构造函数参数注入。

我通常不认为 setter 有任何复杂的行为。常见的逻辑是范围检查或更新依赖于 属性 的东西。如果您需要一些更复杂的逻辑,您可以将其作为方法添加,这暗示该方法不仅仅是设置 属性:

public void SetBar(double value) => Bar = value * foo;

或者使用单独的 属性 来计算 foo*bar:

public MyClass(double foo, double bar) => (Foo, Bar) = (foo, bar);
public double Foo {get; set;}
public double Bar {get; set;}
public double FooBar => Foo * Bar;

到目前为止,这将是我的首选解决方案,因为这种代码很难出错。所有属性的作用应该一目了然。