我在类中创建了一个静态事件,我想从其他类订阅。
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
内部为空,而不是在其他任何地方?我觉得它与静态有关。
答案 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);
}
this
和EventArgs.Empty
的默认值也优于null