0

遅延読み込みを使用して、チケットメッセージが属するサポートチケットに関する情報を読み込みます。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クラスがインスタンス化されるたびにこのオブジェクトが存在することを示す動作が発生しているため、不要なnull参照例外が発生します。遅延読み込みパターンに明らかに問題がありますか?

4

3 に答える 3

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));
    }
}
于 2013-01-21T10:21:32.570 に答える
1

PersonNREの問題は、操作の問題よりもnullである可能性が高いと思います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;
    }
}
于 2013-01-21T10:25:51.410 に答える
1

Person.PersonID呼び出しでの問題は、このオブジェクトが初期化されていることを確認する必要があります。

.Net4には完璧なクラスLazy<>があります

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

public Ticket Ticket
{
    get { return ticket.Value; }
}
于 2013-01-21T11:19:26.563 に答える