当我拥有时,有时我会忘记使用返回值。例如
var s = "foobar";
s.Replace("foo", "notfoo");
// correct: s = s.Replace("foo", "notfoo");
这也适用于我的自定义类似的类,例如,我使用流畅的x.WithSomething()方法返回新值对象而不是修改x。
一种解决方案是使用单元测试。但是,这并不总是适用。那么,当不使用返回值时,如何强制编译器 - 或者至少是运行时错误?
也许,有一个ReSharper或VS解决方案?
更新:好的,它不是由语言强制执行的。所以null参数是,但如果参数为null,我仍然可以抛出异常。 ReSharper可以向我发出很多关于C#未强制执行的事情的警告。但我认为没有办法对未使用的返回值执行相同的操作 - 对于那些我想要使用的返回值。
如果不是系统函数(如string.Replace),但至少对于我自己的类 - 有什么办法吗?比如,返回RequiredReturn< T>或类似的东西。
更新:AOP / PostSharp怎么样?如果我使用[UsageRequired]标记返回值或方法,是否可以使用PostSharp以某种方式检测到使用了返回值?
(注意C#标签)
答案 0 :(得分:2)
如果处理输出值非常重要,可以通过引用传递函数值并使用函数设置,而不是返回它。
这样调用函数的代码就必须通过在编译时将其作为参数提供来考虑输出值
答案 1 :(得分:1)
你没有。
这是一个问题,问我怎么记得给GetSomeStuff()方法分配一些东西?
例如,我一直在做:
GetSomeStuff();
但它应该是:
Stuff some = GetSomeStuff();
请记住。简单。
在相关的说明中,个人而言,我认为如果不影响实例,那么Replace方法不应该是实例方法(是的,我知道字符串是不可变的)。命名应该更好地反映我们正在处理不可变对象上的实例方法。
编辑:为了更好地反映我想说的内容,并对其进行评论。
阿。注意到Resharper 4.5中有一个选项可以发现'非私有方法的未使用的返回值',这可能正是您想要的。
答案 2 :(得分:1)
使用Visual Studio插件resharper。当你编写哑代码时,这个插件会立即告诉你。
答案 3 :(得分:0)
没有运行时解决方案。
ReSharper的“检查严重性”页面上有一个选项,名为“从不使用方法返回值”。您可以尝试将其设置为“显示为错误”。
编辑显然不是什么需要 - 它会发现方法的返回值从不在任何地方使用。我应该从名字中意识到这一点!
为什么不编写自己的工具?在最基本的级别,您可以搜索您的方法和报告以及错误,如果它没有前面的“=”(考虑到代码可能分为多行)。在这个级别它不是交互式的,但如果它工作,你可以将它转换为VS插件。
答案 4 :(得分:0)
您是否考虑过使用FxCop(或Visual Studio Code Analysis,如果有的话)?它包括一个规则,用于筛选某些预定义方法类别的返回值。如果规则未捕获您的遗漏,您可以创建一个检查它们的自定义规则。 (内置规则会捕获示例中的String.Replace问题。)
答案 5 :(得分:-1)
你真的不能用C语法之后的任何语言 - C,C ++或C#。函数的调用者可以自由忽略返回值。