![](/img/trans.png)
[英]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.