簡體   English   中英

C# - 如何檢查缺少scope.Complete()語句?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM