0

他のクラスからサブスクライブしたいクラス内に静的イベントを作成しました。

public class PlaylistModel 
{
    public static event EventHandler PlaylistLoadError;
    public static void LoadPlaylist() 
    {
        try 
        {    
           // ...do some stuff...
        } 
        catch(SomeException ex) 
        {
            EventHandler handler = PlaylistLoadError;

            if(handler != null) 
            {
                PlaylistLoadError(null, null);
            }
        }
    }
}

そして、私の他のクラスでは....

public partial class MainPage : PhoneApplicationPage 
{
    public MainPage() 
    {
        PlaylistModel.PlaylistLoadError += PlaylistError;
    }

    public void PlaylistError(object sender, EventArgs args) 
    {
        //... show the error ...
    }
}

サブスクライブされているにもかかわらず、キャッチの内部では、ハンドラーは null です。MainPageキャッチが実行された後、内部からプログラムをデバッグしましたが、 PlaylistLoadErrornull ではないことが示されています。の中で null になる理由はありPlaylistModelますか? 静的であることと関係があると感じています。

4

2 に答える 2

1

event誰もサブスクライブしていない場合、フィールドの値はnull になる可能性があります。あなたのコメントから、クラスが構築される前にMainPagePlaylistModel クラスの例外がスローされ、その時点でまだ誰もイベントにサブスクライブしていないようです。

また、これはメモリ リークのレシピであることに注意してください。MainPageクラス (または他のクラス) がイベントをサブスクライブすると、クラスPlaylistはそのイベントへの参照を保持し、Playlistクラス内のイベントは静的になります。そのため、イベントにサブスクライブしたすべてのメンバーは、アプリケーションの存続期間中存続します。

于 2013-01-21T23:26:51.743 に答える
0

イベントデリゲートの値は、変数に割り当てるときにコピーされますが、上げるまでにnullになる可能性があります。

EventHandler handler = PlaylistLoadError;

if(handler != null) { // not null
    PlaylistLoadError(null, null); // null
}

イベントからデリゲートを再取得するのではなく、ローカル変数を実行することでエラーを回避できます。

EventHandler handler = PlaylistLoadError;

if(handler != null) {
    handler(this, EventArgs.Empty);
}

thisまた、EventArgs.Emptyデフォルトよりも優れていますnull

于 2013-01-22T00:39:23.790 に答える