如何设置没有setter的私有变量值?



我目前正在做单元测试任务。在这个项目中,我有一个银行账户类和一个单元测试类。在BankAccount类中,我们有一个变量private double balance { get; }

对于私有类型的变量,并且只有get,当我通过一个类函数提取现金后,我如何更新余额?

public double Debit (double amount)
/*Ensuring Debit Amount is Valid and Balance Available for Transaction*/
{
IsAmountVerified(amount);     
if (IsAmountVerified(amount) is false) { throw new ArgumentOutOfRangeException("",WRONG_AMOUNT); }
if (balance < amount) { throw new ArgumentOutOfRangeException("",INSUFFICIENT_BALANCE); }
else **balance -= amount**;
/*Return Value*/
return amount;
}

如何更新余额?我也不能在UnitTesting类中访问这个变量。

[TestMethod]
public void DepositTest1()
{
BankAccount Account = new BankAccount(100, "Baldip Singh");
Account.Deposit(1);
Assert.AreEqual(101, Account.balance);
}

谢谢你的真知灼见,干杯。

为了支持特定的场景,许多工具(序列化器等)使用的技巧是查找名为<{propertyName}>k__BackingField的字段的已知自动支持模式,例如:

[CompilerGenerated]
private readonly double <balance>k__BackingField;

您可以通过反射访问它(GetField(...)Type上,指定一个BindingFlags,包括非公共和实例,然后是SetValue(...))。但是,这不适用于手动实现的后备字段,或者与后备字段没有1:1关系的属性,例如:

private double balance => 42;

然而,一般来说,我会说:使用你实际给出的API表面。如果给定的API不能满足您的需求:更改/扩展API,而不是破坏它。例如,您可以添加setter:

// note I've changed the type, name, and accessibility here!
public decimal Balance { get; private set; }

(你也可以看init而不是set)

只获取自动实现的不可变属性(在构造函数中除外)。要声明返回私有字段变量值的get-only属性,请使用:

private double _balance;
private double balance => _balance;

如果您的业务场景需要更新余额,您需要为该属性添加私有setter(以防只允许在类中更新),否则您的业务场景将无法工作。

如果你想从私有字段中获取值,你可以添加公共getter属性或公共方法来返回需要的值。

在你的情况下,我建议改变你的逻辑像这样:public double Balance {get;私人设置;}

相关内容

  • 没有找到相关文章

最新更新