如何设置属性对象的初始化顺序?
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;
到目前为止,这将是我的首选解决方案,因为这种代码很难出错。所有属性的作用应该一目了然。
例如:假设我有
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;
到目前为止,这将是我的首选解决方案,因为这种代码很难出错。所有属性的作用应该一目了然。