Share via


CA2249: String.IndexOf 대신 String.Contains를 사용하는 것이 좋습니다.

속성
규칙 ID CA2249
타이틀 ‘String.IndexOf’ 대신 ‘String.Contains’ 사용 고려
범주 사용 현황
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 제안 사항

원인

해당 규칙은 substring의 존재 여부를 확인하기 위해 결과를 사용하는 IndexOf를 찾고 가독성을 높이기 위해 Contains를 대신 사용하도록 제안합니다.

규칙 설명

IndexOf를 사용하여 결과가 -1과 같은지 또는 0 이상인지를 확인할 때 성능에 영향을 주지 않고도 호출을 Contains로 안전하게 대체할 수 있습니다.

사용되는 IndexOf 오버로드에 따라 권장 픽스는 추가된 comparisonType 인수를 가져올 수 있습니다.

오버로드 제안된 픽스
String.IndexOf(char) String.Contains(char)
String.IndexOf(string) String.Contains(string, StringComparison.CurrentCulture)
String.IndexOf(char, StringComparison.Ordinal) String.Contains(char)
String.IndexOf(string, StringComparison.Ordinal) String.Contains(string)
String.IndexOf(char, NON StringComparison.Ordinal)* String.Contains(char, NON StringComparison.Ordinal)*
String.IndexOf(string, NON StringComparison.Ordinal)* String.Contains(string, NON StringComparison.Ordinal)*

* 다음 이외의 StringComparison.OrdinalStringComparison 거형 값

위반 문제를 해결하는 방법

위반은 수동으로 해결하거나, 경우에 따라 바로 가기를 사용하여 Visual Studio에서 코드를 수정할 수 있습니다.

예제

다음 두 코드 조각은 C#에서 가능한 모든 규칙 위반과 이를 수정하는 방법을 보여 줍니다.

using System;

class MyClass
{
    void MyMethod()
    {
        string str = "My text";
        bool found;

        // No comparisonType in char overload, so no comparisonType added in resulting fix
        found = str.IndexOf('x') == -1;
        found = str.IndexOf('x') >= 0;

        // No comparisonType in string overload, adds StringComparison.CurrentCulture to resulting fix
        found = str.IndexOf("text") == -1;
        found = str.IndexOf("text") >= 0;

        // comparisonType equal to StringComparison.Ordinal, removes the argument
        found = str.IndexOf('x', StringComparison.Ordinal) == -1;
        found = str.IndexOf('x', StringComparison.Ordinal) >= 0;

        found = str.IndexOf("text", StringComparison.Ordinal) == -1;
        found = str.IndexOf("text", StringComparison.Ordinal) >= 0;

        // comparisonType different than StringComparison.Ordinal, preserves the argument
        found = str.IndexOf('x', StringComparison.OrdinalIgnoreCase) == -1;
        found = str.IndexOf('x', StringComparison.CurrentCulture) >= 0;

        found = str.IndexOf("text", StringComparison.InvariantCultureIgnoreCase) == -1;
        found = str.IndexOf("text", StringComparison.InvariantCulture) >= 0;

        // Suggestion message provided, but no automatic fix offered, must be fixed manually
        int index = str.IndexOf("text");
        if (index == -1)
        {
            Console.WriteLine("'text' Not found.");
        }
    }
}
using System;

class MyClass
{
    void MyMethod()
    {
        string str = "My text";
        bool found;

        // No comparisonType in char overload, so no comparisonType added in resulting fix
        found = !str.Contains('x');
        found = str.Contains('x');

        // No comparisonType in string overload, adds StringComparison.CurrentCulture to resulting fix
        found = !string.Contains("text", StringComparison.CurrentCulture);
        found = string.Contains("text", StringComparison.CurrentCulture);

        // comparisonType equal to StringComparison.Ordinal, removes the argument
        found = !string.Contains('x');
        found = string.Contains('x');

        found = !string.Contains("text");
        found = string.Contains("text");

        // comparisonType different than StringComparison.Ordinal, preserves the argument
        ;found = !string.Contains('x', StringComparison.OrdinalIgnoreCase)
        found = string.Contains('x', StringComparison.CurrentCulture);

        found = !string.Contains("text", StringComparison.InvariantCultureIgnoreCase);
        found = string.Contains("text", StringComparison.InvariantCulture);

        // This case had to be manually fixed
        if (!str.Contains("text"))
        {
            Console.WriteLine("'text' Not found.");
        }
    }
}

Visual Studio에서는 이 규칙에 대한 코드 수정 사항을 사용할 수 있습니다. 이를 사용하려면 위반에 커서를 놓고 Ctrl+ 키를 누릅니다.(마침표). 표시된 옵션 목록에서 ‘String.IndexOf’ 대신 ‘String.Contains’ 사용을 고려해 보세요를 선택합니다.

Code fix for CA2249 - Consider using 'string.Contains' instead of 'string.IndexOf'

경고를 표시하지 않는 경우

코드 가독성 향상이 중요하지 않을 경우 이 규칙 위반을 표시하지 않아도 됩니다.

경고 표시 안 함

단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.

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

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

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

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

참고 항목