Почему свойство не устанавливает себя, когда создается экземпляр класса - PullRequest
0 голосов
/ 09 сентября 2011

В моем классе есть свойство, которое я ожидал бы установить самостоятельно при создании нового экземпляра класса, но это не так, почему?

public class RecurlyData
    {
        private readonly string _accountCode;

        //Default constructor
        public RecurlyData(int accountCode)
        {
            _accountCode = accountCode.ToString();
        }

        public RecurlyAccount Account { get { return GetAccount(); } }

        private RecurlyAccount GetAccount()
        {
            var account = RecurlyAccount.Get(_accountCode);
            account.BillingInfo = RecurlyBillingInfo.Get(account.AccountCode);

            return account;
        }
    }  

Я называю это так:

private List<RecurlyData> _recurlyData;  
    _recurlyData.Add(new RecurlyData(1079));

Ответы [ 3 ]

2 голосов
/ 09 сентября 2011

Это должно позаботиться о создании учетной записи для вас:

public class RecurlyData
{
    private readonly string _accountCode;
    private readonly RecurlyAccount _account;

    //Default constructor
    public RecurlyData(int accountCode)
    {
        _accountCode = accountCode.ToString();
        _account = GetAccount(_accountCode);
    }

    public RecurlyAccount Account { get { return _account; } }

    private static RecurlyAccount GetAccount(string accountCode)
    {
        var account = RecurlyAccount.Get(accountCode);
        account.BillingInfo = RecurlyBillingInfo.Get(account.AccountCode);

        return account;
    }
}  
2 голосов
/ 09 сентября 2011

Я верю, что вы ожидаете, что GetAccount(); будет вызван, когда объект будет построен.

Не так работают свойства.

Получатель свойства действует так же, как метод, поэтому фактически ваше свойство

public RecurlyAccount Account { get { return GetAccount(); } }

Действует точно так же, как метод GetAccount.

Призвание:

var myAccount = this.Account;

На 100% идентичен:

var myAccount = this.GetAccount();

Если этот метод вызывает некоторые видимые побочные эффекты (что, я полагаю, вызывает, иначе не имеет значения, вызывается ли он в конструкторе или нет), то он, скорее всего, не должен находиться в свойстве get.

Каждый раз, когда к Account обращаются, метод вызывается так:

var data = new RecurlyData(1079);
var account = data.Account;
var account2 = data.Account;

Метод GetAccount был вызван дважды. Значение не сохраняется, если вы не напишите код для его сохранения.

@ ответ pstrjds должен дать вам желаемое поведение, но в качестве небольшой альтернативы, если вам не нравится это частное поле поддержки, вы также можете написать:

public class RecurlyData
{
    private readonly string _accountCode;

    public RecurlyData(int accountCode)
    {
        _accountCode = accountCode.ToString();
        Account = GetAccount(_accountCode);
    }

    public RecurlyAccount Account { get; private set; }

    private static RecurlyAccount GetAccount(string accountCode)
    {
        var account = RecurlyAccount.Get(accountCode);
        account.BillingInfo = RecurlyBillingInfo.Get(account.AccountCode);

        return account;
    }
}  

Результат почти точно такой же, за исключением того, что это всего лишь private, а не readonly, так что вы можете установить его где-то, кроме конструктора. Я лично нахожу это чище.

0 голосов
/ 09 сентября 2011

readonly кажется виноватым.private достаточно для защиты данных от изменения.

РЕДАКТИРОВАТЬ: Nevermind, readonly не имеет ничего делать.

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