使只读属性可设置

本文关键字:设置 只读属性 | 更新日期: 2023-09-27 18:14:55

基本上,我在这个类上遇到了一些readonly属性该类的作者告诉我,我可以为特定的任务设置。问题是,它们的值大多是通过操作获得的,而不是直接从类中的私有变量获得的。

的例子:

public decimal? AccruedInterest
{
    get
    {
        if (this.Result != null)
        {
            return this.GetExchangedCurrencyValue(this.Result.AccruedInterest.GetValueOrDefault(decimal.Zero));
        }
        return null;
    }
}

如果我想添加一个setter,我不需要担心Result对象的设置因为我不确定它返回时是否能正确绘制

我能做这样的事情吗?

private decimal? _AccruedInterest;
public decimal? AccruedInterest
{
    get
    {
        if (this._AccruedInterest.HasValue)
        {
            return this._AccruedInterest.Value;
        }
        if (this.Result != null)
        {
            return this.GetExchangedCurrencyValue(this.Result.AccruedInterest.GetValueOrDefault(decimal.Zero));
        }
        return null;
    }
    set
    {
        this._AccruedInterest = value;
    }
}

或者你们中有人看到可能由此产生的问题吗(除了它现在是可更改的事实之外)?

使只读属性可设置

那么你唯一的问题是,如果他们设置值为null,你希望你的属性返回null,而不是评估if语句。

但是您可能不允许它们设置null,在这种情况下,您应该在setter中添加一个检查。

set 
{ 
    if (value == null)
        throw new NullArgumentException("AccruedInterest");
    this._AccruedInterest = value;
}

如果设置null是有效的,你可能需要另一个布尔标志来判断值是否已经设置。

private bool _accruedInterestSet;
private decimal? _accruedInterest;
public decimal? AccruedInterest
{
    get
    {
        if (this._accruedInterestSet)
        {
            return this._accruedInterest; //don't return .Value in case they set null
        }
        if (this.Result != null)
        {
            return this.GetExchangedCurrencyValue(this.Result.AccruedInterest.GetValueOrDefault(decimal.Zero))    ;
        }
        return null;
    }
    set
    {
        this._accruedInterestSet = true;
        this._AccruedInterest = value;
    }
}

我不知道它应该如何工作,但语法上我没有看到你的代码有任何问题。