2012-04-17 162 views
2

我有一个类“b”从类“a”继承。在类“a”中,有一些代码在事件不为null时执行操作。我需要该代码在应用程序的特定时间在类“b”中触发。所以在'b'我订阅了一个新的Handler(事件)。什么是“throw new NotImplementedException();”做到了吗?

如果我离开自动生成的事件“是”类“B”与throw new NotImplementedException();线,代码工作/运行正常。只要我删除thow异常,应用程序不再按预期工作。

那么,什么是throw new NotImplementedException除了抛出异常干什么?

我意识到我可能想在这一点上解决我的编码问题走错了路,我相信我会找到更好的方法来做到这一点(我还在学习),但仍然是我的问题。为什么该行改变了代码的结果?

编辑: 我reallize我wan't非常具体的用我的代码。不幸的是,由于严格的政策,我不能。我在课堂'a'中有一个if语句。

if (someEvent != null) 

当代码'工作'时,if语句返回true。当它没有按预期工作时,它返回'假'。在'b'类中,应用程序'唯一的工作'(或者if语句返回true)是当我在附加新事件时自动生成的类'b的事件方法中的throw new NotImplementedException();行。

+6

这是我第一次注意到有人问为什么**移除**异常会导致不需要的行为;) – 2012-04-17 14:37:29

+0

“不再按预期工作”:您期望什么,取而代之的是什么? – phoog 2012-04-17 14:47:35

+2

这听起来像是有史以来最令人沮丧的项目经理......“蒂姆,你完成了没有实现该功能吗?” – 2012-04-17 15:28:52

回答

3

这仅仅是一个例外,至于为什么它意味着您的应用程序“工作”完全依赖于处理任何异常的代码。

与正常例外情况不同,它不是“特殊”例外情况(除了像其他情况一样从Exception派生出来)。您倾向于将代码生成视为一个占位符来实现它所投入的成员。要做到这一点要比代码生成尝试理解成员结构以输出编译代码要容易得多。

当你说“不再按预期工作”,我假设它编译。如果删除代码不会编译代码,那么机会就会很好,您将得到一个关于返回值的编译错误。

也许触发事件的代码需要处理程序的特定响应,或者如果没有处理程序或发生异常,它会默认响应并继续。在你的情况,有一个处理程序,并没有例外,所以它期望更好的回应?

完整的猜测。

如果在a代码,你需要在b使用,考虑做,如果你需要override的行为,里面的代码protected和可选virtual方法。

+0

关于返回值的好处 - 这种可能性没有发生在我身上 - 但在这里我们正在讨论一个事件处理程序,这将是一个“空白”方法。 – phoog 2012-04-17 14:41:47

+1

@phoog真的,但代替任何实际的事实/代码显示的问题,我可以猜得像一个像;-) – 2012-04-17 14:42:27

6

想一想:如果你想添加两个整数以下方法...

private int Add(int x, int y) 
{ 

} 

...并没有代码里面做这样的(方法甚至不返回整数)。这是NotImplementedException的用途。

+1

真棒的例子... :) – saun4frsh 2014-02-27 14:59:23

2

NotImplementedException是一种声明interface或基础class的特定方法在您的类型中没有实现的方法。这是E_NOTIMPL错误代码的例外形式。

一般来说,一个实现不应该抛出一个NotImplementedException,除非它是该特定的interface特别支持的方案。在绝大多数情况下,情况并非如此,类型应完全实施interfaces

虽然它在做什么。它只是抛出一个异常。很难说为什么程序在面对异常时保持功能,除非你给我们提供更多信息,否则就会失效。

+0

对于一个对象,实现一个接口,但不提供给定接口成员的行为是不是更通常的抛出'NotSupportedException'? – phoog 2012-04-17 14:46:27

+0

@phoog'NotSupportedException'通常保留给接口有一个属性,指定接口上的方法是否有效。例如,如果'ICollection .IsReadOnly'为true,则'ICollection .Add'应该抛出'NotSupportedException'。 'NotImplementedException'只适用于方法未实现的情况。写一篇关于差异文章的博客文章http://blogs.msdn.com/b/jaredpar/archive/2008/12/12/notimplementedexception-vs-notsupportedexception.aspx – JaredPar 2012-04-17 14:49:12

0

NotImplementedException仅仅是一个例外,当你要做的事情的代码还没有写出来的时候就会使用这个例外。它通常用在代码片段中作为占位符,直到您填充使用实际代码生成的任何内容为止。

使用NotImplementedException而不是空白代码块是一种很好的做法,因为它会非常明显地发出错误提醒您代码段尚未完成。如果它是空白的,那么这个方法可能会运行并且什么也不会发生,这有时候会很麻烦。