延迟加载:正在加载对象,即使它从未被引用过

时间:2013-01-21 10:17:55

标签: c# lazy-loading

我正在使用延迟加载来加载有关故障单消息所属的支持故障单的信息。 TicketMessage是Ticket的孩子。在我的TicketMessage类中,当引用TicketMessage对象的Ticket属性时,我有以下代码来延迟加载Ticket对象:

// Lazy loading of Ticket object
private Ticket _Ticket { get; set; }
public Ticket Ticket
{
    get
    {
        return this._Ticket ?? (this._Ticket = new Ticket(TicketID, ClientID, ConnectionString, Person.PersonID));
    }
}

但是,我遇到的行为表明每次TicketMessage类被实例化时都会出现此对象,从而导致一些不需要的空引用异常。我的懒加载模式有什么明显的错误吗?

3 个答案:

答案 0 :(得分:1)

不要将_Ticket作为财产。试试这个:

private Ticket _Ticket = null;

public Ticket Ticket
{
    get
    {
        return this._Ticket != null ? this._Ticket : (this._Ticket = new Ticket(TicketID, ClientID, ConnectionString, Person.PersonID));
    }
}

答案 1 :(得分:1)

我会说你的NRE问题更可能是Person为空而不是null-coalescing操作的问题。

话虽如此,我并不特别喜欢以这种方式做作业的想法。从可读性的角度来看,它将更清晰地写成:

private Ticket _ticket;
...
public Ticket Ticket
{
    get
    {
        if (this._ticket == null)
        {
            this._ticket = new Ticket(TicketID, ClientID, ConnectionString, Person.PersonID);
        }
        return this._ticket;
    }
}

答案 2 :(得分:1)

Person.PersonID调用的问题,你应该确定这个对象是初始化的。

.Net 4有一个完美的类Lazy<>

private Lazy<Ticket> ticket = new Lazy<Ticket>(() => new Ticket(TicketID, ClientID, ConnectionString, Person.PersonID));

public Ticket Ticket
{
    get { return ticket.Value; }
}