我们说我有一个PizzaLover
课程。在这个类中,有CanAffordPizzas
属性:
public bool CanAffordPizzas =>
TryBuyPizzas(this.numDollarsInBankAccount, out uint numAffordablePizzas)
this.numDollarsInBankAccount
是私人财产。
每当我致电numAffordablePizzas
时,我都需要CanAffordPizzas
中包含的信息。我尝试了下面的工作:
public uint NumAffordablePizzas;
public bool CanAffordPizzas =>
TryBuyPizzas(this.numDollarsInBankAccount, out uint this.NumAffordablePizzas);
我可以看到的另一个选项是每次需要调用numDollarsInBankAccount
时声明变量numAffordablePizzas
和TryBuyPizzas(decimal numDollarsInBankAccount, out uint numAffordablePizzas);
,但由于以下原因,这是不能令人满意的:
numDollarsInBankAccount
类中公开(目前为私有)属性PizzaLover
。pizzaLoverInstance.NumDollarsInBankAccount
作为第一个参数传递。实现我想要的优雅解决方案是什么?
答案 0 :(得分:2)
public bool CanAffordPizzas =>
TryBuyPizzas(this.numDollarsInBankAccount, out uint this.NumAffordablePizzas);
out uint xxx
声明类型为xxx
的新变量uint
。要引用现有变量,请省略类型:
TryBuyPizzas(this.numDollarsInBankAccount, out this.NumAffordablePizzas);
答案 1 :(得分:2)
最简单的,在我看来,更正确的解决方案,就是简单地将属性重写为方法:
public bool CanAffordPizzas(out uint numAffordablePizzas)
=> TryBuyPizzas(this.numDollarsInBankAccount, out numAffordablePizzas);
public bool CanAffordPizzas()
=> CanAffordPizzas(out _);
请注意,我在C#7中使用了新的“丢弃”支持,您可以在此处详细了解:Discards - C# Guide。
如果您还没有C#7支持,则需要在第二种方法中创建自己的“discard”变量:
public bool CanAffordPizzas()
{
uint discard;
return CanAffordPizzas(out discard);
}
如果你强迫你的类的用户显式地读取属性以便更新某些其他属性或变量,那么这是一种反模式,通常通过拆分所有内容或重写为使国家影响明确。
“拆分”将是不关心(或知道)关于“可负担的比萨饼”的类型,但让你的“尝试购买”方法返回一个关心(知道)的新对象,这样才能得到唯一的方法知道此值的对象是通过您的属性或方法。
因为在这种情况下,第二个值是那个参数,你最好自己暴露那个部分。