[英]How do I add code outside the scope of Main when using C# 9 Top Level Statements?
[英]C# - How do I check for missing scope.Complete() statements?
我团队中的程序员有时会打开一个事务而忘记包含scope.Complete()语句(参见下面的代码块)。 任何有关方法的想法
(1)搜索我们的解决方案是否缺少scope.Complete()语句,或
(2)让Visual Studio自动突出显示或发出缺少scope.Complete()语句的警告?
这是我们想念的那条线:
using(TransactionScope scope = new TransactionScope())
{
/* Perform transactional work here */
scope.Complete(); <-- we forget this line
/* Optionally, include a return statement */
}
我试过了什么
我尝试过使用ReSharper自定义模式,没有运气。 理想情况下,我会搜索类似的东西:
using(TransactionScope scope = new TransactionScope())
{
$statements1$
[^(scope.Complete();)]
$statements2$
}
但是,ReSharper只接受标识符的正则表达式,而不接受语句,因此这似乎不起作用( http://www.jetbrains.com/resharper/webhelp/Reference__Search_with_Pattern.html )。
有任何想法吗? 我也愿意使用其他插件或工具。
谢谢,
本
您是否可以强制程序员使用自定义API而不是低级范围。完整的东西?
闭包将强制使用.Complete()
:
public static void Do(this TransactionScope scope, Action action) {
using (scope) {
action();
scope.Complete();
}
}
然后你可以这样做:
new TransactionScope().Do(() => /* Transactional stuff */);
NDepend当然可以提供帮助,但不能100%检查你的要求。 NDepend不知道方法体内部(方法调用的顺序)。 所以充其量,您可以在LINQ(CQLinq)上编写代码规则,该规则将检查方法是否正在创建TransactionScope
,至少它必须调用TransactionScope.Complete()
:
warnif count > 0
from m in Application.Methods
where m.CreateA("System.Transactions.TransactionScope") &&
!m.IsUsing("System.Transactions.TransactionScope.Complete()")
select m
请注意,如果开发人员足够严格以避免在一种方法中创建多个TransactionScope
,则此规则应该适合您。
我不知道有任何现有的R#插件可以检查这个,但你当然可以自己创建一个。 您所要做的就是检测带有TransactionScope
类型的变量声明的using语句,然后迭代包含的语句,查找Complete()
调用。
如果您对此感兴趣,我建议您下载ReSharper SDK并查看插件开发指南 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.