All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.sonar.plugins.csharp.S6610.html Maven / Gradle / Ivy

There is a newer version: 10.2.0.105762
Show newest version

Why is this an issue?

With string.StartsWith(char) and string.EndsWith(char), only the first character of the string is compared to the provided character, whereas the string versions of those methods have to do checks about the current StringComparison and CultureInfo. Thus, the char overloads are significantly faster for default comparison scenarios.

These overloads were introduced in .NET Core 2.0.

What is the potential impact?

We measured at least 3.5x improvement in execution time. For more details see the Benchmarks section from the More info tab.

How to fix it

If you are targeting a runtime version equal or greater than .NET Core 2.0, the string.StartsWith and string.EndsWith overloads are available, with the argument’s type being char instead of string. Thus, an argument of char type can be provided.

Code examples

Noncompliant code example

bool StartsWithSlash(string s) =>
    s.StartsWith("/");
bool EndsWithSlash(string s) =>
    s.EndsWith("/");

Compliant solution

bool StartsWithSlash(string s) =>
    s.StartsWith('/');
bool EndsWithSlash(string s) =>
    s.EndsWith('/');

Resources

Documentation

Benchmarks

Method Mean Standard Deviation

StartsWith_String

30.965 ms

3.2732 ms

StartsWith_Char

7.568 ms

0.3235 ms

EndsWith_String

30.421 ms

5.1136 ms

EndsWith_Char

8.067 ms

0.7092 ms

Glossary

The results were generated by running the following snippet with BenchmarkDotNet:

private List<string> data;

[Params(1_000_000)]
public int N { get; set; }

[GlobalSetup]
public void Setup() =>
    data = Enumerable.Range(0, N).Select(_ => Guid.NewGuid().ToString()).ToList();

[Benchmark]
public void StartsWith_String()
{
    _ = data.Where(guid => guid.StartsWith("d")).ToList();
}

[Benchmark]
public void StartsWith_Char()
{
    _ = data.Where(guid => guid.StartsWith('d')).ToList();
}

[Benchmark]
public void EndsWith_String()
{
    _ = data.Where(guid => guid.EndsWith("d")).ToList();
}

[Benchmark]
public void EndsWith_Char()
{
    _ = data.Where(guid => guid.EndsWith('d')).ToList();
}

Hardware configuration:

BenchmarkDotNet=v0.13.5, OS=Windows 10 (10.0.19045.2846/22H2/2022Update)
11th Gen Intel Core i7-11850H 2.50GHz, 1 CPU, 16 logical and 8 physical cores
.NET SDK=7.0.203
  [Host]   : .NET 7.0.5 (7.0.523.17405), X64 RyuJIT AVX2
  .NET 7.0 : .NET 7.0.5 (7.0.523.17405), X64 RyuJIT AVX2




© 2015 - 2024 Weber Informatics LLC | Privacy Policy