2010-05-10 2 views
4

그것의 당신이 연결로 소수의 자리에 모두 StringBuilder를 사용하지 말아야 상식 :에,도구 (의 StringBuilder를 사용한다) String.Concat의 사용/남용을 감지하는

string s = "Hello"; 
if (greetingWorld) 
{ 
    s += " World"; 
} 

s += "!"; 

그러나 상당한 크기의 루프는, 모두 StringBuilder는 분명한 선택입니다 :

string s = ""; 
foreach (var i in Enumerable.Range(1,5000)) 
{ 
    s += i.ToString(); // <- bad idea! 
} 

Console.WriteLine(s); 

내가 String.Concat하는 소스 코드에 를 식별하기 위해 원료의 C# 소스 또는 컴파일 된 어셈블리 중 하나에서 실행할 수있는 도구가 있습니까 내가 뭐라고? (익숙하지 않다면 s += "foo"은 일리노이 출력에서 ​​String.Concat에 매핑됩니다.) 분명히 전체 프로젝트를 사실적으로 검색 할 수없고 각 +=을 평가하여 lvalue가 문자열인지 여부를 식별 할 수 없습니다.

이상적으로는 for/foreach 루프 내에서만 호출을 가리키지 만, 마다 모든 오감 (false positive)을 지정하기도합니다.String.Concat입니다. 또한, 내 코드가 StringBuilder을 사용하도록 자동으로 리팩터링하는 리팩토링 도구가 있음을 알고 있습니다 만,이 시점에서 Concat 사용을 식별하는 데에만 관심이 있습니다.

나는 내 코드에서 Gendarme과 FxCop을 일상적으로 실행했지만,이 도구들 중 어느 것도 내가 설명한 것을 식별하지 못한다. 그러나 @Cristian pointed out으로 이전 버전의 FxCop이이를 확인하는 데 사용되었습니다. FxCop의 이전 버전에서이 규칙을 추출하여 최신 버전 (1.36)에 사용하도록 지시하는 방법이 있습니까?

+0

흠, C# (또는 .NET)에는 FindBugs가 필요합니다. –

답변

3

아마도 NDepend CQL (코드 쿼리 언어)은 충분히 표현할 수 있습니다. 비록 그것이 인 경우에 확실하지 않은.

0

FxCop에는이 있습니다. 이 코드에있는 문서에 따라 예를 들어 this article

을 확인합니다

static string BadConcatenate(string[] items) 
{ 
    string strRet = string.Empty; 

    foreach(string item in items) 
    { 
     strRet += item; 
    } 

    return strRet; 
} 

의 FxCop은

"Change StringCompareTest.BadConcatenate(String[]):String to use StringBuilder 
    instead of String.Concat or + 

편집

그것은 규칙처럼 CA1807가 제거 된 보인다

중 하나 를보고의 때문에 높은 소음 또는 더 이상 적용 할 수없는 분석. 그리고 컴파일러 is not automatically replacing it처럼 보입니다. 같은 링크에서 두 가지 방법의 성능에 대해 더 자세히 설명합니다.

+0

분명히 내가 이것을 보지 못한 이유는 [특정 규칙이 2007 년 이전에 제거되었습니다] (http://blogs.msdn.com/codeanalysis/archive/2007/08/09/what-rules-do-microsoft- has-turned-internally.aspx # 5390704). * "불행히도 이러한 규칙은 이전 데이터 흐름 엔진을 기반으로했으며 제품에서 제거 될 때 제거되었습니다. 이후 버전의 Visual Studio에서 복구 할 예정입니다."* –

관련 문제