例如:假設我有
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 中初始化,我可以拋出例外,但是有沒有辦法設定這個要求,所以無論誰實體化這個屬性物件,這都不會有任何問題?
uj5u.com熱心網友回復:
我認為公共二傳手在這種特殊情況下是不合適的。我建議改用建構式:
public MyClass(double foo, double value) => (Foo, Bar) = (foo, value*foo);
public double Foo {get; private set;}
public double Bar {get; private set;}
請注意,我沒有呼叫 parameter bar
,因為這會導致期望Bar
-property 應該具有bar
引數的值。
如果您愿意,您可以選擇給 Bar 一個默認值。但一般來說,建構式應該確保型別是完全構造的,所以任何需要的屬性都應該作為建構式引數注入。
我一般不會期望二傳手有任何復雜的行為。常見的邏輯是范圍檢查或更新依賴于屬性的東西。如果您需要一些更復雜的邏輯,您可以將其添加為方法,這暗示該方法不僅僅設定屬性:
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;
到目前為止,這將是我首選的解決方案,因為很難弄錯這種代碼。所有屬性的作用應該非常明顯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/476519.html
下一篇:如何在帶有BouncyCastle的C#中使用secp256k1使用SeedHex簽署TransactionHex?