Share via


CA1304: CultureInfo를 지정하십시오.

속성
규칙 ID CA1304
타이틀 CultureInfo를 지정하세요.
범주 전역화
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 아니요

원인

메서드 또는 생성자가 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

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

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

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

분석할 코드 구성

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

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

특정 기호 제외

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

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

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

  • 기호 이름만(포함하는 형식 또는 네임스페이스와 관계없이 해당 이름의 모든 기호 포함).
  • 기호의 설명서 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를 개별 정규화된 시그니처와 비교합니다.

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

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

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

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

  • 형식 이름만(포함하는 형식이나 네임스페이스와 관계없이 해당 이름의 모든 형식 포함)
  • 기호의 설명서 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에 전달하여 첫 번째 위반을 해결하고 string3이 사용자에게 표시되기 때문에 현재 문화권을 String.ToLower에 전달하여 두 번째 위반을 해결합니다.

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));
        }
    }
}

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

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

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

참고 항목