CA2249: String.IndexOf 대신 String.Contains를 사용하는 것이 좋습니다.
속성 | 값 |
---|---|
규칙 ID | CA2249 |
제목 | ‘String.IndexOf’ 대신 ‘String.Contains’ 사용 고려 |
범주 | 사용 현황 |
수정 사항이 주요 변경인지 여부 | 주요 변경 아님 |
.NET 9에서 기본적으로 사용 | 제안 사항 |
원인
해당 규칙은 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.Ordinal
열 StringComparison
거형 값
- CurrentCulture
- CurrentCultureIgnoreCase
- InvariantCulture
- InvariantCultureIgnoreCase
- OrdinalIgnoreCase
위반 문제를 해결하는 방법
위반은 수동으로 해결하거나, 경우에 따라 바로 가기를 사용하여 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’ 사용을 고려해 보세요를 선택합니다.
경고를 표시하지 않는 경우
코드 가독성 향상이 중요하지 않을 경우 이 규칙 위반을 표시하지 않아도 됩니다.
경고 표시 안 함
단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.
#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
자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.
참고 항목
.NET