다음과 같은 코드가 있습니다.
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
나는 그 사건에 관심이 없다. 내가 사용 하는가 OrdinalIgnoreCase
, InvariantCultureIgnoreCase
또는 CurrentCultureIgnoreCase
?
다음과 같은 코드가 있습니다.
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
나는 그 사건에 관심이 없다. 내가 사용 하는가 OrdinalIgnoreCase
, InvariantCultureIgnoreCase
또는 CurrentCultureIgnoreCase
?
답변:
최신 .Net Docs에는 현재 상황에 가장 적합한 것을 결정하는 데 도움이되는 표가 있습니다.
MSDN의 " Microsoft .NET 2.0에서 문자열 사용에 대한 새로운 권장 사항 "에서
요약 : 이전
InvariantCulture
에 문자열 비교, 케이싱 및 정렬 에 사용했던 코드 소유자String
는 Microsoft .NET 2.0에서 새로운 오버로드 집합을 사용해야합니다 . 특히 문화에 구애받지 않고 언어 적으로 관련이 없도록 설계된 데이터 는 새 열거 형StringComparison.Ordinal
또는StringComparison.OrdinalIgnoreCase
멤버를 사용하여 오버로드를 지정해야합니다StringComparison
. 이것들strcmp
은 본질적으로 상징적 인 문자열의 언어 적 해석으로 인한 버그를 피할뿐만 아니라 더 나은 성능을 제공한다는 점 과 비슷한 바이트 별 비교를 강제합니다 .
"Straße"
및을 고려하십시오 "STRASSE"
. 사용하는 경우 수익을 , 반면 그들이 동일한있어 말한다. OrdinalIgnoreCase
Equals
false
InvariantCultureIgnoreCase
유니 코드 문자열을 비교하는 것은 어렵습니다.
텍스트 처리 소프트웨어에서 유니 코드 문자열 검색 및 비교를 구현하려면 동등한 코드 포인트가 있어야합니다. 이 기능이 없으면 특정 코드 포인트 시퀀스를 검색하는 사용자는 다르지만 정식으로 코드 포인트가 다른 시각적으로 구분할 수없는 글리프를 찾을 수 없습니다.
참조 : http://en.wikipedia.org/wiki/Unicode_equivalence
대소 문자를 구분하지 않는 방식으로 두 개의 유니 코드 문자열을 비교하려고하고 어디서나 작동 하려면 불가능한 문제가 있습니다.
고전적인 예는 터키어 i 이며 대문자로 표시하면 İ가됩니다 (점에 유의).
기본적으로 .Net 프레임 워크는 문자열 관련 함수에 CurrentCulture 를 .Equals
사용하지만 서수 (바이트 단위) 비교를 사용하는 것을 제외하고는 매우 중요한 예외가 있습니다.
이것은 의도적으로 컴퓨터의 문화에 따라 다르게 작동하는 다양한 문자열 기능으로 이어집니다.
그럼에도 불구하고 때때로 우리는 대소 문자를 구분하지 않는 "일반적인 목적"을 원합니다.
예를 들어, 응용 프로그램이 설치된 컴퓨터에 관계없이 문자열 비교가 동일한 방식으로 작동하기를 원할 수 있습니다.
이를 위해 3 가지 옵션이 있습니다.
유니 코드 동등성 규칙은 복잡하므로 방법 1) 또는 2)를 사용하는 것보다 비용이 많이 듭니다 OrdinalIgnoreCase
. OrdinalIgnoreCase
특별한 유니 코드 정규화를 수행하지 않는다는 사실 은 컴퓨터 화면에서 동일한 방식으로 렌더링되는 일부 문자열이 동일하게 간주 되지 않음을 의미합니다. 예를 들면 다음 "\u0061\u030a"
과 같습니다 "\u00e5"
. 그러나 서수 비교에서는 다른 것으로 간주됩니다.
당신이 선택하는 것은 당신이 만들고있는 어플리케이션에 달려 있습니다.
Microsoft는 명확한 지침과 함께 권장 사항을 제시 합니다. 그러나 이러한 문제에 접근하기 전에 유니 코드 동등성의 개념을 이해하는 것이 정말로 중요합니다.
또한, OrdinalIgnoreCase는 매우 특수한 종류 의 짐승 이라는 점을 명심하십시오. 이는 서사적 측면에서 혼합 된 일부와 약간의 서수 비교를 선택하고 선택하는 것입니다. 혼란 스러울 수 있습니다.
당신이 아니라면 난 도망 invariantculture 부끄러워 것하지만 그것은 당신이 원하는에 따라 매우 당신이 다른 언어에 대한 코드를 지역화하고 싶지는 않을 것이다. 대신 CurrentCulture를 사용하십시오.
또한, OrdinalIgnoreCase는 원하는 숫자 일 수도 있고 아닐 수도있는 숫자를 존중해야합니다.
매우 간단한 대답은 터키어를 사용하지 않는 한 InvariantCulture를 사용할 필요가 없다는 것입니다.
다음 링크를 참조하십시오.