如何解决如果在循环中调用某个方法,C# 编译器是否会抛出错误或警告
我团队中的开发人员经常会在循环中编写代码,从而进行相对较慢的调用(即数据库访问或 Web 服务调用或其他慢速方法)。这是一个超级常见的错误。
是的,我们会练习代码审查,我们会尝试在合并之前捕获并修复它们。不过,越早失败越好,对吧?
那么有没有办法通过编译器来捕捉这个错误?
示例:
想象一下这个方法
public ReturnObject SlowMethod(Something thing)
{
// method work
}
public ReturnObject Call(IEnumerable<Something> things)
{
foreach(var thing in Things)
SlowMethod(thing); // Should throw compiler error or warning in a loop
}
有没有什么办法可以用属性或编译器语句来装饰上面的SlowMethod(),让它在循环中使用时会报错?
解决方法
不,常规 C# 中没有任何内容可以防止方法在循环中使用。
您的选择:
- 通过提供更易于使用的替代方案来阻止循环使用。提供处理集合的第二个(或唯一的)方法可能会阻止人们在循环中编写足够多的调用,因此它不再是一个主要问题。
- 尝试编写自己的代码分析规则(说明教程 - https://docs.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/tutorials/how-to-write-csharp-analyzer-code-fix)
- 如果方法的调用频率超出您的预期,请为其添加运行时保护。
显然,在循环中调用那些缓慢的方法是有意义的 - 您正在努力防止这种情况发生,但这是将工作投入到根本上是负面的。为什么不做一些积极的事情呢?显然,您提供了一个便于在循环中使用的 API。因此,提供一些更容易正确使用的替代方法,以前在循环中会发生错误使用,例如:
- 一个基于可迭代的 API,它将使循环隐式,以消除一些延迟,因为您可以全面了解将要迭代的内容,并且可以适当地隐藏延迟,
- 一个不会阻塞线程的异步 API,示例代码展示了如何在您目前遇到的典型情况下使用它;请记住,很难正确使用的 API 将不会被使用!
- 最低公分母 API:将方法拆分为请求者和结果提供者,因此自然会有两个循环:一个用于提交所有请求,另一个用于收集和处理结果(我不喜欢这样方法,因为它不会使代码更好)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。