0
我們有舊代碼,人們可以將自定義的私有變量寫入屬性(公共Foo {get; set;})。我如何檢測這個?NDepend可以自動檢測屬性
我們有舊代碼,人們可以將自定義的私有變量寫入屬性(公共Foo {get; set;})。我如何檢測這個?NDepend可以自動檢測屬性
要編寫這樣的規則,您需要以某種方式加入相應的屬性訪問器和字段。我能想象兩種方式進行:
您可以檢查哪些屬性的getter/setter方法是讀/分配哪個字段(只有一個字段)
您可以在字段和屬性的名稱定義圖案(例如每場名稱的前綴是兩個字符,富屬性對應於m_Foo場)
的第一條規則可能看起來像:
// <Name>Use Automatic Property</Name>
warnif count > 0
from t in Application.Types
from f in t.Fields
where !f.Name.Contains('<') // Eliminate generated by compiler fields
let getter = (from m in t.Methods
where m.IsPropertyGetter &&
m.FieldsReadButNotAssigned.Contains(f) &&
m.FieldsUsed.Count() == 1
select m)
let setter = (from m in t.Methods
where m.IsPropertySetter &&
m.FieldsAssigned.Contains(f) &&
m.FieldsUsed.Count() == 1
select m)
where getter.Count() > 0 || setter.Count() > 0
select new { f, getter, setter }
第二條規則可能看起來像:
// <Name>Use Automatic Property</Name>
warnif count > 0
from t in Application.Types
from f in t.Fields
where !f.Name.Contains('<') // Eliminate generated by compiler fields
// Here we consider that field name is prefixed with two any characters
where f.Name.Length > 2
let name = f.Name.Substring(2, f.Name.Length -2)
let getter = (from m in t.Methods
where m.IsPropertyGetter &&
m.SimpleName == "get_" + name
select m).SingleOrDefault()
let setter = (from m in t.Methods
where m.IsPropertySetter &&
m.SimpleName == "set_" + name
select m).SingleOrDefault()
where getter != null || setter != null
select new { f, getter, setter }
雖然第二條規則可能會錯過一些積極的,第一條規則將返回許多假陽性。也許我們可以寫出兩者的混合體(名稱上有一個模式,如屬性名稱包含部分字段名稱)。