NotImplementedException - 但它应该永远不会被调用

时间:2017-07-22 05:04:42

标签: c# exception resharper

逻辑上,有问题的方法应该是抽象的,但是它们是在继承自的父表单上,如果它们被声明为抽象,Visual Studio将具有适合性。

好的,我让尸体扔了NotImplementedException。 Resharper标志着我并不能容忍代码中的警告。

对此有一个优雅的答案还是我不得不忍受一些丑陋?目前我在做:

protected virtual void SaveCurrentItem()
{
    Trace.Assert(false, "Only the children of FormCore.SaveCurrentItem should be called");
}

protected virtual void SetItem()
{
    Trace.Assert(false, "Only the children of FormCore.SetItem should be called");
}

类本身永远不应该被实例化,只有它的子元素。但是,当您查看其中一个孩子的设计者时,Visual Studio会坚持创建一个。

2 个答案:

答案 0 :(得分:3)

您可以考虑创建嵌套的受保护接口。例如:

protected interface IManageItems
{
    void SaveCurrentItem();
    void SetItem();
}

从FormCore继承的每个类都可以单独实现该接口。那么你就不会有调用基类实现的风险,因为它不会是任何一个。

从基类调用方法:

(this as IManageItems)?.SaveCurrentItem();

这样可以使方法在父类中没有初始声明的情况下就像virtual一样。如果您想强制接近abstract的行为,您可以检查接口是否在基类的构造函数中实现,然后如果它不是,则抛出异常。事情显然在这里变得有点不可思议,因为这实际上是IDE阻止你做的事情的解决方法,因此对于这样的事情没有真正干净,标准的解决方案。我确信大多数人会在看到嵌套的受保护界面时感到畏缩,但是如果你不想在你的基类中实现一个实现并且你不能标记你的基类抽象,那么你就不要&# 39;有很多选择。

要考虑的另一件事是favoring composition over inheritance来提供您需要的功能。

另一方面,不是使用接口,而是在类无法执行操作的情况下简单地抛出NotSupportedException可能是合适的。 NotImplementedException旨在仅用于开发中项目,这就是ReSharper标记该方法的原因。

  

NotSupportedException:不支持调用的方法时,或者尝试读取,搜索或写入不支持调用的功能的流时引发的异常。

一个用例是:

  

您从一个抽象类继承,要求您覆盖许多方法。但是,您只准备为其中一部分提供实施。对于您决定不实现的方法,可以选择抛出NotSupportedException。

有关详细信息和使用指南,请参阅NotSupportedException documentation on MSDN

答案 1 :(得分:1)

Resharper会发出警告,提醒用户代码尚未完成。如果您实际需要的行为是不支持这些方法,则应该抛出NotSupportedException而不是NotImplementedException,以使您的意图更清晰。