C#3.0-对象初始值设定项

时间:2020-03-06 14:40:11  来源:igfitidea点击:

我有一个小问题,我不明白为什么,很容易解决,但是我仍然想理解。

我有以下课程:

public class AccountStatement : IAccountStatement
{
     public IList<IAccountStatementCharge> StatementCharges { get; set; }

    public AccountStatement()
    {
        new AccountStatement(new Period(new NullDate().DateTime,newNullDate().DateTime), 0);
    }

    public AccountStatement(IPeriod period, int accountID)
    {
        StatementCharges = new List<IAccountStatementCharge>();
        StartDate = new Date(period.PeriodStartDate);
        EndDate = new Date(period.PeriodEndDate);
        AccountID = accountID;
    }

     public void AddStatementCharge(IAccountStatementCharge charge)
    {
        StatementCharges.Add(charge);
    }

}

(注意startdate,enddate,accountID是自动属性,...)

如果我这样使用它:

var accountStatement = new AccountStatement{
                                              StartDate = new Date(2007, 1, 1),
                                              EndDate = new Date(2007, 1, 31),
                                              StartingBalance = 125.05m
                                           };

当我尝试使用方法" AddStatementCharge:我最终得到一个" null" StatementCharges列表时……在逐步的过程中,我清楚地看到列表得到了一个值,但是一旦退出实例化行,列表变为" null"

解决方案

这段代码:

public AccountStatement()
{
    new AccountStatement(new Period(new NullDate().DateTime,newNullDate().DateTime), 0);
}

无疑不是我们想要的。这将创建AccountStatement的第二个实例,并且不执行任何操作。

我认为意思是这样的:

public AccountStatement() : this(new Period(new NullDate().DateTime, new NullDate().DateTime), 0)
{
}

无参数构造函数会创建其自身的新实例,但不会将其分配给任何对象。

使用

public AccountStatement() : this(new Period(new NullDate().DateTime,newNullDate().DateTime), 0) { }

的插入

public AccountStatement()
    {
        new AccountStatement(new Period(new NullDate().DateTime,newNullDate().DateTime), 0);
    }

我们正在调用一个无参数的构造函数,因此永远不会初始化AddStatementCharge。使用类似:

var accountStatement = new AccountStatement(period, accountId) {
                                          StartDate = new Date(2007, 1, 1),
                                          EndDate = new Date(2007, 1, 31),
                                          StartingBalance = 125.05m
                                       };