我的类中有一个属性,我希望在创建类的新实例时设置它,但它没有,为什么?
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));
答案 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
没有可以做。