0
우리는 사람들이 자동 속성 (public Foo {get; set;})으로 바뀔 수있는 사용자 지정 개인 변수에 대해 속성을 작성한 오래된 코드가 있습니다. 어떻게 탐지 할 수 있습니까?NDepend가 자동으로 속성을 검색 할 수 있습니다.
우리는 사람들이 자동 속성 (public Foo {get; set;})으로 바뀔 수있는 사용자 지정 개인 변수에 대해 속성을 작성한 오래된 코드가 있습니다. 어떻게 탐지 할 수 있습니까?NDepend가 자동으로 속성을 검색 할 수 있습니다.
이러한 규칙을 작성하려면 해당 속성 접근 자 및 필드를 어떻게 든 참여시켜야합니다.
당신은 속성 게터/세터 읽고/할당 필드 (하나 개의 필드)
당신은 필드와 프로퍼티의 이름에 패턴을 정의 할 수있는 확인할 수 있습니다 내가 진행하는 두 가지 방법을 상상할 수
첫 번째 규칙은 같이 볼 수 있었다 (예를 들어 모든 필드 이름이 두 글자로 시작되어, 푸 속성은 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 }
, 첫 번째 규칙은 많은 거짓을 리턴합니다. 어쩌면 우리는 두 가지를 혼합하여 작성할 수 있습니다 (이름에 부분적으로 필드 이름을 포함하는 속성 이름과 같은 패턴 사용).