C# 没有实现例外——但它';这是一种永远不应该被称为

C# 没有实现例外——但它';这是一种永远不应该被称为,c#,exception,resharper,C#,Exception,Resharper,从逻辑上讲,所讨论的方法应该是抽象的,但它们位于继承自的父窗体上,如果它们被声明为抽象的话,VisualStudio将具有适合性 好的,我让主体抛出一个NotImplementedException。Resharper标记了这一点,我不能容忍代码中出现这样的警告 这有一个优雅的答案,还是我必须忍受一些丑陋?目前我正在做: protected virtual void SaveCurrentItem() { Trace.Assert(false, "Only the children of

从逻辑上讲,所讨论的方法应该是抽象的,但它们位于继承自的父窗体上,如果它们被声明为抽象的话,VisualStudio将具有适合性

好的,我让主体抛出一个
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");
}

类本身不应该被实例化,只应该实例化它的子类。但是,VisualStudio在查看它的一个孩子的设计器时坚持要创建一个。

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

protected interface IManageItems
{
    void SaveCurrentItem();
    void SetItem();
}
从FormCore继承的每个类都可以单独实现接口。这样您就不会有调用基类实现的风险,因为没有任何实现

要从基类调用方法,请执行以下操作:

(this as IManageItems)?.SaveCurrentItem();
这将产生这样的效果:使方法的行为就像它们是
virtual
,而不必在父类中进行初始声明。如果您想强制一个更接近于
抽象的行为
,您可以检查接口是否在基类的构造函数中实现,如果没有,则抛出异常。这里的情况显然有点不稳定,因为这基本上是IDE阻止你做的事情的一个解决方法,因此对于这样的事情没有真正干净的标准解决方案。我相信大多数人看到嵌套的受保护接口都会畏缩不前,但是如果您不想在基类中实现,并且无法将基类标记为抽象,那么您没有很多选择

另外要考虑的是提供您需要的功能。


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

NotSupportedException:当调用的方法不受支持时,或当试图读取、查找或写入不支持调用功能的流时引发的异常

一个用例是:

您继承了一个抽象类,该类要求您重写许多方法。但是,您只准备为其中的一个子集提供一个实现。对于决定不实现的方法,可以选择抛出NotSupportedException


请参阅更多信息和使用指南。

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

protected interface IManageItems
{
    void SaveCurrentItem();
    void SetItem();
}
从FormCore继承的每个类都可以单独实现接口。这样您就不会有调用基类实现的风险,因为没有任何实现

要从基类调用方法,请执行以下操作:

(this as IManageItems)?.SaveCurrentItem();
这将产生这样的效果:使方法的行为就像它们是
virtual
,而不必在父类中进行初始声明。如果您想强制一个更接近于
抽象的行为
,您可以检查接口是否在基类的构造函数中实现,如果没有,则抛出异常。这里的情况显然有点不稳定,因为这基本上是IDE阻止你做的事情的一个解决方法,因此对于这样的事情没有真正干净的标准解决方案。我相信大多数人看到嵌套的受保护接口都会畏缩不前,但是如果您不想在基类中实现,并且无法将基类标记为抽象,那么您没有很多选择

另外要考虑的是提供您需要的功能。


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

NotSupportedException:当调用的方法不受支持时,或当试图读取、查找或写入不支持调用功能的流时引发的异常

一个用例是:

您继承了一个抽象类,该类要求您重写许多方法。但是,您只准备为其中的一个子集提供一个实现。对于决定不实现的方法,可以选择抛出NotSupportedException


有关更多信息和使用指南,请参阅。

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

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

您好,请分享您的代码好吗?谢谢如果你想要替代设计,我想你需要更全面地描述你当前的设计。也许你可以把这些方法转移到一个非表单类?看起来它们可能是业务逻辑,无论如何最好放在UI代码之外。@Blorgbeard每个表单都是不同类型数据的编辑器——在对象和屏幕字段之间加载/保存方法。因此,它们是UI,而不是业务逻辑