我的库有一些方法,其返回值永远不会被丢弃。即使对我来说,泄漏它们也是一个非常普遍的错误。所以我希望编译器在程序员发出警报时提醒他们。
这样的值可以存储或用作另一种方法的参数。它并不严格地使用存储的值,但如果它被简单地丢弃则是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分析器用于构建后事件,但感觉就像过于复杂......
答案 0 :(得分:1)
如果您实施Code Analysis / FXCop,规则 CA1806 - 请勿忽略方法结果将涵盖此案例。
请参阅:How to Enable / Disable Code Analysis for Managed Code
基本上,它就像转到项目文件,代码分析选项卡,选中一个框并选择要发生错误/警告的规则一样简单。
基本上勾选复选框@ 1,然后使用2进入一个窗口,您可以在其中配置规则集文件(这可以是您在库之间共享的文件或更全局的文件(如果您有构建服务器,请确保它存储在构建可以到达的地方,即源不在本地机器上。)
这是一个规则集,其中包含我的意思:
答案 1 :(得分:0)
Nicolai的答案为任何类型启用规则集,但我只需要检查我的库类型(我不想强迫我的库用户在其所有代码上应用规则集)。
按照评论中的建议随处使用会使库的使用变得困难。
因此我选择了另一种方法。
InvalidOperationException
。对象创建StackTrace可选地记录并附加到错误消息中。SetNotLeaked()
以递归方式禁用对特定对象和所有内部对象的检查。这不是编译时检查,但肯定会被注意到。
这不是一个非常优雅的解决方案,它打破了一些指导方针,但它可以满足我的需要,不会让用户查看不必要的警告(RuleSet解决方案),也不会影响代码清洁度(out)。
对于测试,我必须创建一个基类,我在Appdomain.UnhandledException
方法中设置SetUp
处理程序并检查(在GC.Collect
之后)是否在TearDown
中抛出了任何异常,因为从另一个线程调用终结器,否则NUnit将测试显示为已通过。