2012-01-09 1 views
6

내 머리 뒤쪽 어딘가에서 작은 음성이 "C# 코드가 냄새"라고 말합니다.C# : StartsWith와 두 개의 ToUpperInvariant 호출을 결합하는 것보다 더 좋은 방법

private const string STR_ConnectionString = "ConnectionString"; 
private readonly string upperCaseConnectionString = STR_ConnectionString.ToUpperInvariant(); 
// a lot further on 
string keyAttributeValue = keyAttribute.Value; 
if (keyAttributeValue.ToUpperInvariant().StartsWith(upperCaseConnectionString)) 
{ 
    // some C# code handling a key that starts with "ConnectionString" 
} 

상수 STR_ConnectionString은 코드의 다른 위치에도 사용됩니다.

냄새를 제거하는 방법은 무엇입니까?

+0

유효성 검사가 너무 자주 수행되는 경우 확장 메서드를 작성하십시오. – Samich

+2

냄새가 좋습니까? 또는 그것은 나쁜 냄새가나요? 나에게 좋아 보인다 : D – Shai

+0

+1 @Shai 아마 원래의 코드베이스가 .NET 1.1이라고 언급 했어야 만하지만 곧 .NET 4로 업그레이드 될 것이다. .NET 4로 업그레이드 한 후에 과부하로 간다. –

답변

5

당신은 overloaded StartsWith methodStringComparison 열거 값 복용 사용할 수 있습니다 : 그것은 있기 때문에,

if (keyAttributeValue.StartsWith(STR_ConnectionString, 
           StringComparison.InvariantCultureIgnoreCase) 
{ 
    ... 
} 

그것은 또한 당신의 코드를 더 쉽게 읽을 :

keyAttributeValue.StartsWith(STR_ConnectionString, StringComparison.OrdinalIgnoreCase) // or use StringComparison.InvariantCultureIgnoreCase here 
+0

수락 됨. 나는이 해결책을 갈거야. 이 코드베이스가 사용하는 .NET 1.1 FW에는 없지만 곧 .NET 4가 될 것입니다. –

4

는 대소 문자를 구별 매칭을 지원하는 StartsWith overload이를 당신의 의도를 표현합니다 : 당신이 정말로 원하는 것은 대소 문자를 구별하지 않는 비교이며, 여기에 쓰여 있습니다. 대/소문자를 구분하여 대문자로 변환 한 값을 비교하는 것을 원하지는 않습니다. 목표를 달성하는 데 사용하는 해결 방법 일뿐입니다.

1

StringComparison을 사용하여 내 프로젝트에서 대소 문자를 무시하는 확장 메서드를 만들었습니다.

public static string StartsWithIgnoreCase(this string value, string startsWith) 
{ 
    return value.StartsWith(value, StringComparison.InvariantCultureIgnoreCase); 
} 

원하는 경우 null 체크를 추가 할 수 있습니다. 당신이 당신의 자신의 방법을 압연하는 것처럼

STR_ConnectionString..StartsWith(upperCaseConnectionString, StringComparison.CurrentCultureIgnoreCase); 

그러나 보이는 : 당신의 ToUpper하고 있기 때문에 나쁜 냄새 경우

+0

+1 연장 방법은 갈 방법입니다! – SQLMason

+0

-1 확장 방법은 현재 사용중인 IgnoreCase 유형을 숨기는 것입니다. 차이점을 알아 보려면 http://stackoverflow.com/a/417992/146513 및 http://blogs.msdn.com/b/noahc/archive/2007/06/29/string-equals-performance-comparison.aspx를 확인하십시오. 각 경우에 고려해야합니다. –

+0

@Protron OP가'ToUpperInvariant'를 사용했기 때문에'InvariantCulture'를 사용했습니다. 올바른 문화권을 항상 사용해야합니다. 좋은 링크를 가져 주셔서 감사합니다. – cadrell0

2

다음 문자열들은 startswith의 오버로드를 사용하여 결합 할 수 비교 응용 프로그램 구성을 처리하십시오. 이 항상

keyAttributeValue.StartsWith(STR_ConnectionString, StringComparison.InvariantCultureIgnoreCase) 

입니다하지만 당신이 무엇을뿐만 아니라 수행하지 않습니다 http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx

+0

일종의 앱 구성입니다.하지만 그다지 좋지 않습니다. 저는 몇 년 전부터 엉덩이를 걷어차 야했던 팀에서 물려받은 것입니다. :) 상속 된 코드의 나머지가 어떻게 보이는지 알고 싶지는 않습니다. 어쩌면 당신은 할 수 있지만, 한꺼번에하는 것은 아닙니다. 다가오는 몇 달 동안 주요 리팩토링 작업을 단계적으로 수행 할 것입니다. –

2

참조하십시오. 초당 수천 번해야하는 경우 보유하고있는 것에 충실하십시오. 그렇지 않은 경우 대소 문자를 구분하지 마십시오.

또한 빠르게 당신이 어떻게 든 원하는 것을 아마도

keyAttributeValue.StartsWith(STR_ConnectionString, StringComparison.OrdinalIgnoreCase) 

을 고려하십시오.