2010-07-20 64 views
3

使用VisualStudio的常見問題是屬性獲取器的神祕調用。如果這些副作用(最常見的形式爲if (foo == null) foo = new foo(); return foo;),那麼調試器Locals和Watch窗口調用屬性的事實 - 即使沒有任何中斷點 - 也可能在調試時導致意想不到的效果。如何使用NDepend找到哪些屬性獲取者有副作用?

有一個簡單的解決方案,這樣的:剛標記與屬性

 [DebuggerBrowsable(DebuggerBrowsableState.Never)] 

那麼,怎樣才能找到我可以在一個大的代碼庫的副作用干將的財產?

NDepend是首選這種事情的工具:利用其CQL語言,我可以找到所有這些,例如,直接改變其含有實例的狀態屬性:

  SELECT METHODS FROM ASSEMBLIES "FOO" 
     WHERE IsPropertyGetter AND ChangesObjectState 

這隻能找到那些直接改變字段的獲得者:我如何找到間接改變字段的獲得者,例如通過調用Initialize()方法?

回答

1

喬爾,這可能要歸功於Code Query through LINQ capabilities(CQLinq)。這是一個CQLinq查詢,用於檢測屬性獲取者的深度可變性。對於每個引起可變性的獲得者,代碼查詢顯示分配的字段集合。

// Restrict the iteration only on property getters 
// that are changing states or that call a method that changes state 
let propertyGetters = Application.Methods.Where(m => m.IsPropertyGetter) 

let methodsThatChangeState = 
    Application.Methods.Where(m => m.ChangesObjectState || m.ChangesTypeState) 

from m in propertyGetters.DepthOfIsUsingAny(methodsThatChangeState).DefinitionDomain 
      .Union(propertyGetters.Intersect(methodsThatChangeState)) 

// Find all methods called directly or indirectly by the property getter 
let methodsCalledIndirectly = 
     m.MethodsCalled.FillIterative(
      methods => methods.SelectMany(m1 => m1.MethodsCalled)) 
     .DefinitionDomain 
     .Union(m.ToEnumerable()) 

// Gather all field assigned that are not generated by the compiler 
let fieldsAssigned = methodsCalledIndirectly 
        .SelectMany(m1 => m1.FieldsAssigned) 
        .Where(f => !f.IsGeneratedByCompiler) 

where fieldsAssigned.Any() 
orderby fieldsAssigned.Count() descending 
select new { m, fieldsAssigned } 

這個查詢是複雜的,主要是因爲我優化它,第一隻保留自己改變狀態,或者直接或間接地調用即改變狀態(呼叫到DepthOfIsUsingAny())的方法,吸氣劑。

然後,對於每一個吸氣器,我們直接或間接建立所有方法的集合(感謝FillIterative()),我們收集所有這些方法分配的所有字段。

具體查詢結果的樣子:

enter image description here

+0

感謝帕特里克。順便說一下,是否可以使用CQL來查找某個方法是否可能通過接口使用? – 2010-07-22 12:03:57

+0

Joel,現在幾乎所有事情都可以通過CQLinq感謝(請參閱我的新答案)如果您有其他需求,請提出一個新問題。 – 2012-06-13 07:50:11

+0

夢幻般的,保持良好的工作! – 2012-06-13 09:07:59

相關問題