CA2241: 형식 메서드에 올바른 인수를 제공하십시오.

속성
규칙 ID CA2241
타이틀 서식 지정 메서드에 올바른 인수를 제공하십시오.
범주 사용 현황
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 제안 사항

원인

format 와 같은 WriteLineWriteSystem.String.Format 메서드에 전달되거나 각 개체 인수에 해당하는 형식 항목을 포함하지 않거나 그 반대의 경우도 마찬가지입니다.

기본적으로 이 규칙은 이전에 언급된 세 가지 메서드에 대한 호출만 분석하지만 이는 구성 가능합니다.

규칙 설명

WriteLine, Write, Format 등의 메서드에 대한 인수는 서식 문자열과 여러 System.Object 인스턴스로 구성됩니다. 서식 문자열은 양식 {index[,alignment][:formatString]}의 텍스트 및 포함된 서식 항목으로 구성됩니다. 'index'는 형식을 지정할 개체 부분을 나타내는 0부터 시작하는 정수입니다. 개체의 서식 문자열에 해당 인덱스가 없는 경우 해당 개체는 무시됩니다. ‘인덱스’로 지정된 개체가 없으면 런타임에 System.FormatException이 throw됩니다.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 각 개체 인수에 서식 항목을 제공하고 각 서식 항목에 대한 개체 인수를 제공합니다.

경고를 표시하지 않는 경우

이 규칙에서는 경고를 표시해야 합니다.

분석할 코드 구성

다음 옵션을 사용하여 이 규칙을 실행할 추가 메서드를 구성할 수 있습니다.

추가 문자열 서식 지정 메서드

이 규칙에 따라 분석되어야 하는 추가 문자열 서식 지정 메서드의 이름을 구성할 수 있습니다. 예를 들어 문자열 서식 지정 메서드로 MyFormat이라 명명된 모든 메서드를 지정하기 위해 프로젝트의 editorconfig 파일에 다음 키-값 쌍을 추가할 수 있습니다.

dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat

옵션 값의 허용되는 메서드 이름 형식(|로 구분):

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

예:

옵션 값 요약
dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat 컴파일에 명명된 MyFormat 모든 메서드와 일치합니다.
dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat1|MyFormat2 컴파일에서 MyFormat2 명명된 MyFormat1 모든 메서드와 일치합니다.
dotnet_code_quality.CA2241.additional_string_formatting_methods = NS.MyType.MyFormat(ParamType) 지정된 정규화된 서명과 특정 메서드 MyFormat 를 일치합니다.
dotnet_code_quality.CA2241.additional_string_formatting_methods = NS1.MyType1.MyFormat1(ParamType)|NS2.MyType2.MyFormat2(ParamType) 특정 메서드 MyFormat1MyFormat2 각 정규화된 서명과 일치합니다.

자동으로 추가 문자열 서식 지정 메서드 확인

추가 문자열 서식 지정 메서드의 명시적 목록을 지정하는 대신, 문자열 서식 지정 메서드를 자동으로 확인하도록 분석기를 구성할 수 있습니다. 기본적으로 이 옵션은 사용할 수 없습니다. 이 옵션을 사용하도록 설정하는 경우 string format 매개 변수 뒤에 params object[] 매개 변수가 있는 모든 메서드는 문자열 서식 지정 메서드로 간주합니다.

dotnet_code_quality.CA2241.try_determine_additional_string_formatting_methods_automatically = true

예시

다음 예제에서는 규칙의 두 가지 위반을 보여 줍니다.

Imports System

Namespace ca2241

    Class CallsStringFormat

        Sub CallFormat()

            Dim file As String = "file name"
            Dim errors As Integer = 13

            ' Violates the rule.
            Console.WriteLine(String.Format("{0}", file, errors))

            Console.WriteLine(String.Format("{0}: {1}", file, errors))

            ' Violates the rule and generates a FormatException at runtime.
            Console.WriteLine(String.Format("{0}: {1}, {2}", file, errors))

        End Sub

    End Class

End Namespace
class CallsStringFormat
{
    void CallFormat()
    {
        string file = "file name";
        int errors = 13;

        // Violates the rule.
        Console.WriteLine(string.Format("{0}", file, errors));

        Console.WriteLine(string.Format("{0}: {1}", file, errors));

        // Violates the rule and generates a FormatException at runtime.
        Console.WriteLine(string.Format("{0}: {1}, {2}", file, errors));
    }
}