为什么在实例化类时没有属性设置

时间:2011-09-09 17:33:58

标签: c#-4.0

我的类中有一个属性,我希望在创建类的新实例时设置它,但它没有,为什么?

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 个答案:

答案 0 :(得分:2)

这应该为您创建帐户:

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;
    }
}  

答案 1 :(得分:2)

我相信你期望发生的事情是在构造对象时会调用GetAccount();

这不是物业的运作方式。

属性的getter就像一个方法,所以实际上你的属性

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,所以你可以从构造函数以外的地方设置它。我个人认为它更干净。

答案 2 :(得分:-2)

readonly似乎是值得责备的人。 private足以保护数据不被修改。

编辑:没关系,readonly 没有可以做。