C#类事件中的静态事件null

时间:2013-01-21 23:14:09

标签: c# windows-phone-7 events

我在类中创建了一个静态事件,我想从其他类订阅。

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 ...
    }
}

在catch的内部,处理程序为null,尽管它已被订阅。我已经在执行catch之后从MainPage内调试了程序,并且PlaylistLoadError显示为不为空。任何想法为什么它会在PlaylistModel内部为空,而不是在其他任何地方?我觉得它与静态有关。

2 个答案:

答案 0 :(得分:1)

如果没有人订阅,event字段的值可以为null。根据您的评论,您的PlaylistModel类中的异常似乎是在之前抛出构建MainPage类,此时没有人订阅该事件。

另请注意,这是内存泄漏的方法。当您的MainPage类(或任何其他类)订阅该事件时,Playlist类包含对它的引用,Playlist类中的事件是静态的。因此,活动的所有订阅成员都将在您的应用程序的生命周期内生效。

答案 1 :(得分:0)

当您将事件委托给变量时,会复制该事件委托的值,但在您将其提升时可能为null:

EventHandler handler = PlaylistLoadError;

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

您可以通过执行本地变量来避免错误,而不是从事件中重新获取委托:

EventHandler handler = PlaylistLoadError;

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

thisEventArgs.Empty的默认值也优于null