如何避免“从未使用方法”消息?
Posted
技术标签:
【中文标题】如何避免“从未使用方法”消息?【英文标题】:How to avoid 'Method is never used' message? 【发布时间】:2015-08-20 20:08:38 【问题描述】:在以下示例中,Resharper 抱怨 DoA()
方法从未被使用过,尽管它是由“AImplementator”类实现的:
namespace Test
public interface A
// Method 'DoA' is never used
void DoA();
public class AImplementator: A
public void DoA()
throw new System.NotImplementedException();
我无法理解这种行为,因为正在使用该接口。
-
为什么会这样?
如何解决此警告?
Obs:我可以使用 cmets 或 [UsedImplicitly]
属性来抑制警告。但鉴于这种情况,这些选项似乎都不正确。我正在使用 Resharper 9.1。
【问题讨论】:
DoA 是一种方法而不是一种属性。除此之外,我刚刚尝试过,它并没有发出关于从未使用过DoA
的警告。可以提供截图吗?我得到的唯一警告是将interface A
重命名为interface IA
。
无法在 8.2 中重复此警告。 DoA()
当然是一种方法。
在类中实现它不被视为使用它。这很有道理。
对我来说并不完全合理。它是公共接口的成员。 Resharper 无法知道 i/f 成员是否在任何地方或在全球数百万个开发人员项目中被调用。可能是 Resharper 中的错误?甚至 Jetbrains 也不是完美的!
【参考方案1】:
只有在Solution-Wide Analysis is enabled 时才会显示此警告。
警告是关于 interface 方法的使用(在本例中为调用)。下面的例子应该演示它(注意 var
与接口作为局部变量类型)。
var instance = new AImplementator();
// Does NOT make A.DoA() "used":
instance.DoA();
A instanceAsInterface = new AImplementator();
// DOES make A.DoA() "used":
instanceAsInterface.DoA();
【讨论】:
【参考方案2】:回答其他人来这里。
如果你有 resharper 10。
您可以使用 jetrains 注释:
将其添加到您的项目中:https://www.nuget.org/packages/JetBrains.Annotations 文档:https://www.jetbrains.com/help/resharper/10.0/Reference__Code_Annotation_Attributes.html将属性:[UsedImplicitly]
放在类上方就足够了。
很高兴知道它也可以放在基类上。
在这种情况下,将其放在接口 A 上将修复所有子类显示的消息(非常适合 ioc 实现)
namespace Test
[JetBrains.Annotations.UsedImplicitly]
public interface A
// Method 'DoA' is never used
void DoA();
public class AImplementator: A
public void DoA()
throw new System.NotImplementedException();
测试
最好的解决方案是编写单元测试来涵盖这些功能。 这样做的好处是你的规格也被覆盖了。
【讨论】:
这是一个不好的解决方案的原因是它被“隐式使用”直到它不是。因此,如果有人去删除单个实现,那么它真的从未使用过,并且警告被注释隐藏 @JumpingJezza 非常好。如果你正在建立一个图书馆,我认为这是唯一的方法。除非你写测试:)以上是关于如何避免“从未使用方法”消息?的主要内容,如果未能解决你的问题,请参考以下文章
如何避免在 iOS 中使用 Facebook SDK 时出现“重复状态消息”错误?