确保库

时间:2016-01-14 09:00:19

标签: c# compiler-errors il

我的库有一些方法,其返回值永远不会被丢弃。即使对我来说,泄漏它们也是一个非常普遍的错误。所以我希望编译器在程序员发出警报时提醒他们。

这样的值可以存储或用作另一种方法的参数。它并不严格地使用存储的值,但如果它被简单地丢弃则是100%的错误。

是否有任何易于设置的方法来为我的图书馆用户强制执行此操作?

var x = instance.Method(); // ok
field = instance.Method(); // ok
instance.OtherMethod(instance.Method()); // ok
MyMethod(instance.Method()); // ok, no need to check inside MyMethod
instance.Method(); // callvirt and pop - error!

我考虑过将IL分析器用于构建后事件,但感觉就像过于复杂......

2 个答案:

答案 0 :(得分:1)

如果您实施Code Analysis / FXCop,规则 CA1806 - 请勿忽略方法结果将涵盖此案例。

请参阅:How to Enable / Disable Code Analysis for Managed Code

基本上,它就像转到项目文件,代码分析选项卡,选中一个框并选择要发生错误/警告的规则一样简单。

enter image description here

基本上勾选复选框@ 1,然后使用2进入一个窗口,您可以在其中配置规则集文件(这可以是您在库之间共享的文件或更全局的文件(如果您有构建服务器,请确保它存储在构建可以到达的地方,即源不在本地机器上。)

这是一个规则集,其中包含我的意思:

enter image description here

答案 1 :(得分:0)

Nicolai的答案为任何类型启用规则集,但我只需要检查我的库类型(我不想强迫我的库用户在其所有代码上应用规则集)。

按照评论中的建议随处使用会使库的使用变得困难。

因此我选择了另一种方法。

  1. 在终结器中,我检查是否有任何方法被调用(这足以让我确认用法)。如果不是 - InvalidOperationException。对象创建StackTrace可选地记录并附加到错误消息中。
  2. 用户可以调用SetNotLeaked()以递归方式禁用对特定对象和所有内部对象的检查。
  3. 这不是编译时检查,但肯定会被注意到。

    这不是一个非常优雅的解决方案,它打破了一些指导方针,但它可以满足我的需要,不会让用户查看不必要的警告(RuleSet解决方案),也不会影响代码清洁度(out)。

    对于测试,我必须创建一个基类,我在Appdomain.UnhandledException方法中设置SetUp处理程序并检查(在GC.Collect之后)是否在TearDown中抛出了任何异常,因为从另一个线程调用终结器,否则NUnit将测试显示为已通过。