使readonly属性可设置

时间:2011-11-16 14:57:25

标签: c# .net properties

所以基本上我在这一个类上遇到了一些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;
    }
}

或者你们中有没有人看到可能产生的问题(除了它现在可以改变的事实)?

2 个答案:

答案 0 :(得分:3)

你唯一的问题是,如果他们将值设置为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;
    }
}

答案 1 :(得分:0)

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