簡體   English   中英

Null條件運算符為事件拋出空引用

[英]Null Conditional Operator throws a Null Reference for Event

據我所知,null條件運算符(?。)在運行下一位代碼之前檢查null,但在此代碼中:

public delegate void EventArgs(object Sender, PlayerPage Page);
public event EventArgs PageChanged;
private PlayerPage _CurrentPage = PlayerPage.NoPage;
public PlayerPage CurrentPage
{
    get { return _CurrentPage; }
    set { _CurrentPage = value; PropertyChangedFire(); this?.PageChanged(this,value); }
}

但是這個?。PageChanged(this,value); 拋出空引用異常

編輯:

哦......我多么愚蠢:)改為PageChanged?.Invoke(); 感謝您及時的回復

您需要檢查PageChanged是否為空。 然后你可以在它上面調用Invoke來引發事件。

PageChanged?.Invoke(this,value);

附注:這正是Resharper為C#6推薦的內容

也許這不是你的想法?

?. 檢查this為null *)。 實際上,很難對this為空。

public event EventArgs PageChanged; 是一個事件 如果沒有附加處理程序,則事件的“值”為空。 在這一刻,調用this?.PageChanged(this,value); 會拋出。 我很確定是這樣的,它沒有任何用處?. 應用於this運算符。

*)我的意思是,您當前的代碼相當於:

set
{
    _CurrentPage = value;
    PropertyChangedFire();
    if(this!=null)
        this.PageChanged(this,value);
}

在正確調用事件的同時,您需要:

set
{
    _CurrentPage = value;
    PropertyChangedFire();
    if(this.PageChanged!=null)
        this.PageChanged(this,value);
}

或者更確切地說,是線程安全的:

set
{
    _CurrentPage = value;
    PropertyChangedFire();
    var localref = this.PageChanged;
    if(localref!=null)
        localref(this,value);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM