네임스페이스 System.Collections에는 기본적으로 지역 문화에 민감한 동작을 제공하는 클래스와 멤버가 있습니다.
CaseInsensitiveComparer 및 CaseInsensitiveHashCodeProvider 클래스에 대한 매개 변수가 없는 생성자는 속성 Thread.CurrentCulture을 사용하여 새 인스턴스를 초기화합니다. 모든 CollectionsUtil.CreateCaseInsensitiveHashtable 메서드의 오버로드는 기본적으로 Hashtable 속성을 사용하여 Thread.CurrentCulture
클래스의 새 인스턴스를 만듭니다. 메서드의 ArrayList.Sort 오버로드는 기본적으로 Thread.CurrentCulture
를 사용하여 문화권 구분 정렬을 수행합니다.
SortedList에서 문자열을 키로 사용할 때, 조회 및 정렬이 Thread.CurrentCulture
에 의해 영향을 받을 수 있습니다. 이 섹션에 제공된 사용 권장 사항을 따라 네임스페이스 Collections
에서 이러한 클래스 및 메서드의 문화에 민감하지 않은 결과를 얻으십시오.
비고
비교 메서드에 전달 CultureInfo.InvariantCulture 하면 문화권을 구분하지 않는 비교가 수행됩니다. 그러나 파일 경로, 레지스트리 키 및 환경 변수와 같이 비언어적 비교는 발생하지 않습니다. 비교 결과에 따라 보안 결정을 지원하지도 않습니다. 비언어적 비교나 결과 기반 보안 결정을 지원하려면, 응용 프로그램은 StringComparison 값을 허용하는 비교 메서드를 사용해야 합니다. 그 후에는 애플리케이션이 StringComparison를 전달해야 합니다.
CaseInsensitiveComparer
및 CaseInsensitiveHashCodeProvider
클래스 사용
매개변수가 없는 생성자는 CaseInsensitiveHashCodeProvider
, CaseInsensitiveComparer
클래스를 새 인스턴스로 초기화하여 Thread.CurrentCulture
를 사용해 문화에 민감한 동작을 생성합니다. 다음 코드 예제는 매개변수가 없는 Hashtable
및 CaseInsensitiveHashCodeProvider
생성자를 사용하여 문화권 구분이 가능한 CaseInsensitiveComparer
생성자를 보여줍니다.
internalHashtable = New Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default)
internalHashtable = new Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);
문화에 구애받지 않는 Hashtable
를 만들고자 한다면, CaseInsensitiveComparer
및 CaseInsensitiveHashCodeProvider
클래스를 사용하고, culture
매개 변수를 허용하는 생성자를 통해 이러한 클래스의 새 인스턴스를 초기화하세요.
culture
매개 변수에 대해 CultureInfo.InvariantCulture를 지정합니다. 다음 코드 예제에서는 문화권을 구분 Hashtable
하지 않는 생성자를 보여 줍니다.
internalHashtable = New Hashtable(New
CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
(CultureInfo.InvariantCulture),
new CaseInsensitiveComparer(CultureInfo.InvariantCulture));
CollectionsUtil.CreateCaseInsensitiveHashTable
메서드 사용
이 CollectionsUtil.CreateCaseInsensitiveHashTable
메서드는 문자열의 대소문자를 무시하여 Hashtable
클래스의 새 인스턴스를 생성하는 데 유용한 바로가기입니다. 그러나 CollectionsUtil.CreateCaseInsensitiveHashTable
메서드의 모든 오버로드는 Thread.CurrentCulture
속성을 사용하기 때문에 문화에 민감합니다. 이 방법을 사용하여 문화에 민감하지 않은 Hashtable
를 생성할 수 없습니다. 문화에 구애받지 않는 Hashtable
를 만들려면 Hashtable
매개 변수를 허용하는 culture
생성자를 사용합니다.
culture
매개 변수에 대해 CultureInfo.InvariantCulture
를 지정합니다. 다음 코드 예제에서는 문화권을 구분 Hashtable
하지 않는 생성자를 보여 줍니다.
internalHashtable = New Hashtable(New
CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
(CultureInfo.InvariantCulture),
new CaseInsensitiveComparer(CultureInfo.InvariantCulture));
SortedList
클래스 사용
A SortedList
는 키별로 정렬되고 키 및 인덱스별로 액세스할 수 있는 키 및 값 쌍의 컬렉션을 나타냅니다. 문자열이 키인 SortedList
위치를 사용하면 정렬 및 조회가 속성의 Thread.CurrentCulture
영향을 받을 수 있습니다. 문화에 민감하지 않은 동작을 SortedList
에서 얻으려면, SortedList
매개변수를 허용하는 생성자 중 하나를 사용하여 comparer
을(를) 만드세요.
comparer
매개 변수는 키를 비교할 때 사용할 IComparer 구현을 지정합니다. 매개 변수의 경우 키를 비교하는 데 사용하는 CultureInfo.InvariantCulture
사용자 지정 비교자 클래스를 지정합니다. 다음 예제는 생성자에 comparer
매개 변수로 지정할 수 있는 사용자 지정 문화에 무관한 비교자 클래스를 설명합니다.
Imports System.Collections
Imports System.Globalization
Friend Class InvariantComparer
Implements IComparer
Private m_compareInfo As CompareInfo
Friend Shared [Default] As New InvariantComparer()
Friend Sub New()
m_compareInfo = CultureInfo.InvariantCulture.CompareInfo
End Sub
Public Function Compare(a As Object, b As Object) As Integer _
Implements IComparer.Compare
Dim sa As String = CType(a, String)
Dim sb As String = CType(b, String)
If Not (sa Is Nothing) And Not (sb Is Nothing) Then
Return m_compareInfo.Compare(sa, sb)
Else
Return Comparer.Default.Compare(a, b)
End If
End Function
End Class
using System;
using System.Collections;
using System.Globalization;
internal class InvariantComparer : IComparer
{
private CompareInfo _compareInfo;
internal static readonly InvariantComparer Default = new
InvariantComparer();
internal InvariantComparer()
{
_compareInfo = CultureInfo.InvariantCulture.CompareInfo;
}
public int Compare(Object a, Object b)
{
if (a is string sa && b is string sb)
return _compareInfo.Compare(sa, sb);
else
return Comparer.Default.Compare(a,b);
}
}
일반적으로, 사용자 지정 불변 비교자를 명시하지 않고 SortedList
를 문자열에 사용할 경우, 목록이 채워진 후 Thread.CurrentCulture
로 변경하면 목록이 무효화될 수 있습니다.
ArrayList.Sort
메서드 사용
ArrayList.Sort
메서드의 오버로드는 기본적으로 Thread.CurrentCulture
속성을 사용하여 문화권 구분 정렬을 수행합니다. 정렬 순서가 다르기 때문에 문화권에 따라 결과가 달라질 수 있습니다. 문화권에 민감한 동작을 제거하려면 IComparer
구현을 허용하는 이 메서드의 오버로드를 사용하십시오. 매개변수 comparer
에 대한 사용자 지정 불변 비교자 클래스를 CultureInfo.InvariantCulture
사용하는 것으로 지정합니다. SortedList 클래스 사용 항목에서 사용자 지정 고정 비교자 클래스의 예가 제공됩니다.
참고하십시오
.NET