다음을 통해 공유


CA1304: CultureInfo를 지정하십시오.

속성
규칙 ID CA1304
제목 CultureInfo를 지정하세요.
범주 전역화
수정 사항이 호환성을 깨뜨리는지 여부 주요 변경 아님
.NET 10에서 기본적으로 사용하도록 설정 아니요
적용 가능한 언어 C# 및 Visual Basic

원인

메서드 또는 생성자가 System.Globalization.CultureInfo 매개 변수를 수락하는 오버로드가 있는 멤버를 호출하지만 CultureInfo 매개 변수를 사용하는 오버로드는 호출하지 않습니다. 이 규칙은 다음 메서드에 대한 호출을 무시합니다.

이 규칙에서 제외할 더 많은 기호를 구성할 수도 있습니다.

규칙 설명

CultureInfo 또는 System.IFormatProvider 개체가 제공되지 않으면 오버로드된 멤버에서 제공하는 기본값이 모든 로캘에서 원하는 효과를 나타내지 않을 수 있습니다. 또한 .NET 멤버는 코드에 적합하지 않을 수 있다는 가정에 따라 기본 문화권 및 서식을 선택합니다. 코드가 시나리오에서 예상대로 작동하도록 하려면 다음 지침에 따라 문화권 관련 정보를 제공해야 합니다.

  • 값이 사용자에게 표시되면 현재 설정된 문화권을 사용합니다. CultureInfo.CurrentCulture을 참조하세요.

  • 값이 소프트웨어에 의해 저장되고 액세스되며, 즉 파일이나 데이터베이스에 영구적으로 보관되는 경우, 불변 문화권을 사용하십시오. CultureInfo.InvariantCulture을 참조하세요.

  • 값의 대상을 모르는 경우 데이터 소비자 또는 공급자가 문화권을 지정하도록 합니다.

오버로드된 멤버의 기본 동작이 사용자의 요구 사항에 적합한 경우에도 코드를 자체 문서화하고 더 쉽게 유지 관리할 수 있도록 문화권 관련 오버로드를 명시적으로 호출하는 것이 좋습니다.

참고

CultureInfo.CurrentUICultureSystem.Resources.ResourceManager 클래스의 인스턴스를 사용하여 지역화된 리소스를 검색하는 데만 사용됩니다.

위반 문제를 해결하는 방법

이 규칙의 위반 문제를 해결하려면 CultureInfo 인수를 사용하는 오버로드를 사용합니다.

경고를 표시하지 않는 경우

기본 문화권이 올바른 선택이고 코드 유지 관리가 중요한 개발 우선 순위가 아닌 경우 이 규칙의 경고를 표시하지 않아도 됩니다.

경고 표시 안 함

단일 위반을 억제하려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 비활성화한 다음 다시 활성화합니다.

#pragma warning disable CA1304
// The code that's violating the rule is on this line.
#pragma warning restore CA1304

파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않도록 설정하려면 구성 파일에서 심각도를 로 설정합니다.

[*.{cs,vb}]
dotnet_diagnostic.CA1304.severity = none

자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.

분석할 코드 구성

다음 옵션을 사용하여 이 규칙이 실행될 코드베이스 부분을 구성합니다.

이 규칙, 적용되는 모든 규칙 또는 적용되는 이 범주의 모든 규칙(세계화)에 대해 이러한 옵션을 구성할 수 있습니다. 자세한 내용은 코드 품질 규칙 구성 옵션을 참조하세요.

특정 기호 제외

excluded_symbol_names 옵션을 설정하여 분석에서 형식 및 메서드와 같은 특정 기호를 제외할 수 있습니다. 예를 들어 MyType이라는 형식 내 코드에서 규칙을 실행하지 않도록 지정하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가합니다.

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

참고

XXXX CAXXXX 부분을 해당 규칙의 ID로 바꿉니다.

옵션 값의 허용되는 기호 이름 형식(|로 구분):

  • 기호 이름만(포함하는 형식 또는 네임스페이스와 관계없이 해당 이름의 모든 기호 포함).
  • 기호의 문서 ID 형식에 있는 완전 자격 이름. 각 기호 이름에는 메서드의 경우 M:, 형식의 경우 T:, 네임스페이스의 경우 N:과 같은 기호 종류 접두사가 필요합니다.
  • 생성자의 경우 .ctor이고 정적 생성자의 경우 .cctor입니다.

예:

옵션 값 요약
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType MyType이라는 모든 기호와 일치합니다.
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 MyType1 또는 MyType2라는 모든 기호와 일치합니다.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) 특정 메서드 MyMethod를 지정된 정규화된 시그니처와 비교합니다.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) 특정 메서드 MyMethod1MyMethod2를 개별 정규화된 시그니처와 비교합니다.

특정 형식 및 해당 파생 형식 제외

excluded_type_names_with_derived_types 옵션을 설정하여 분석에서 특정 형식 및 해당 파생 형식을 제외할 수 있습니다. 예를 들어 MyType이라는 형식 및 해당 파생 형식 내에 있는 메서드에서 규칙이 실행되지 않도록 지정하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가합니다.

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

참고

XXXX CAXXXX 부분을 해당 규칙의 ID로 바꿉니다.

옵션 값의 허용되는 기호 이름 형식(|로 구분):

  • 형식 이름만(포함하는 형식이나 네임스페이스와 관계없이 해당 이름의 모든 형식 포함)
  • 기호의 설명서 ID 형식에 있는 정규화된 이름(선택적 T: 접두사 포함)

예:

옵션 값 요약
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType MyType이라는 모든 형식 및 모든 해당 파생 형식과 일치합니다.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 MyType1 또는 MyType2라는 모든 형식 및 모든 해당 파생 형식과 일치합니다.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType 지정된 정규화된 이름과 해당 모든 파생 형식의 특정 MyType 형식을 일치시킵니다.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 각 완전히 지정된 이름의 특정 MyType1, MyType2 유형 및 그 모든 파생 유형과 일치합니다.

위반 문제를 해결하는 방법을 보여 주는 예제

다음 예제에서 BadMethod는 이 규칙의 두 가지 위반을 발생시킵니다. GoodMethod는 고정 문화권을 String.Compare에 전달하여 첫 번째 위반을 해결하고 String.ToLower이 사용자에게 표시되기 때문에 현재 문화권을 string3에 전달하여 두 번째 위반을 해결합니다.

public class CultureInfoTest
{
    public void BadMethod(String string1, String string2, String string3)
    {
        if (string.Compare(string1, string2, false) == 0)
        {
            Console.WriteLine(string3.ToLower());
        }
    }

    public void GoodMethod(String string1, String string2, String string3)
    {
        if (string.Compare(string1, string2, false,
                          CultureInfo.InvariantCulture) == 0)
        {
            Console.WriteLine(string3.ToLower(CultureInfo.CurrentCulture));
        }
    }
}

서식이 지정된 출력을 보여 주는 예제

다음 예제에서는 현재 문화가 IFormatProvider 형식에서 선택한 기본 DateTime에 미치는 영향을 보여 줍니다.

public class IFormatProviderTest
{
    public static void Main1304()
    {
        string dt = "6/4/1900 12:15:12";

        // The default behavior of DateTime.Parse is to use
        // the current culture.

        // Violates rule: SpecifyIFormatProvider.
        DateTime myDateTime = DateTime.Parse(dt);
        Console.WriteLine(myDateTime);

        // Change the current culture to the French culture,
        // and parsing the same string yields a different value.

        Thread.CurrentThread.CurrentCulture = new CultureInfo("Fr-fr", true);
        myDateTime = DateTime.Parse(dt);

        Console.WriteLine(myDateTime);
    }
}

이 예제는 다음과 같은 출력을 생성합니다.

6/4/1900 12:15:12 PM
06/04/1900 12:15:12

참조 항목