Настройка свойств только для чтения - PullRequest
4 голосов
/ 16 ноября 2011

Итак, в основном я обнаружил некоторые свойства readonly в этом одном классе, которые, как сказал мне автор этого класса, я мог сделать настраиваемым для конкретной задачи. Проблема в том, что большую часть времени они получают свою ценность путем манипуляций, а не напрямую из закрытой переменной в классе.

Пример:

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

Так что, если я хочу добавить установщик, я не хочу беспокоиться о настройке этого 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 ]

3 голосов
/ 16 ноября 2011

Что ж, ваша единственная проблема в этом заключается в том, что они устанавливают значение null, и вы хотите, чтобы ваше свойство возвращало null, а не вычисляло оператор if.

Но вы можете не разрешить им устанавливать null, вв этом случае вы должны добавить проверку в установщик.

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;
    }
}
0 голосов
/ 16 ноября 2011

Я не знаю, как это должно работать, но синтаксически я не вижу ничего плохого в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...