get_Property()使用TrySomething()方法和" out"参数。如何存储" out"值?

时间:2018-04-05 07:55:55

标签: c#

我们说我有一个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时声明变量numAffordablePizzasTryBuyPizzas(decimal numDollarsInBankAccount, out uint numAffordablePizzas);,但由于以下原因,这是不能令人满意的:

  • 这需要我在numDollarsInBankAccount类中公开(目前为私有)属性PizzaLover
  • 导致代码重复。
  • 无法保证调用者始终将pizzaLoverInstance.NumDollarsInBankAccount作为第一个参数传递。

实现我想要的优雅解决方案是什么?

2 个答案:

答案 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);
}

如果你强迫你的类的用户显式地读取属性以便更新某些其他属性或变量,那么这是一种反模式,通常通过拆分所有内容或重写为使国家影响明确。

“拆分”将是不关心(或知道)关于“可负担的比萨饼”的类型,但让你的“尝试购买”方法返回一个关心(知道)的新对象,这样才能得到唯一的方法知道此值的对象是通过您的属性或方法。

因为在这种情况下,第二个值那个参数,你最好自己暴露那个部分。