
Inline adoc files when they are included exactly once. Also fix language tags because this inlining gives us better information on what language the code is written in.
52 lines
1.3 KiB
Plaintext
52 lines
1.3 KiB
Plaintext
== Why is this an issue?
|
|
|
|
`StringBuilder` instances that never build a `string` clutter the code and worse are a drag on performance. Either they should be removed, or the missing `ToString()` call should be added.
|
|
|
|
=== Noncompliant code example
|
|
|
|
[source,csharp]
|
|
----
|
|
public void DoSomething(List<string> strings) {
|
|
var sb = new StringBuilder(); // Noncompliant
|
|
sb.Append("Got: ");
|
|
foreach(var str in strings) {
|
|
sb.Append(str).Append(", ");
|
|
// ...
|
|
}
|
|
}
|
|
----
|
|
|
|
=== Compliant solution
|
|
|
|
[source,csharp]
|
|
----
|
|
public void DoSomething(List<string> strings) {
|
|
foreach(var str in strings) {
|
|
// ...
|
|
}
|
|
}
|
|
----
|
|
or
|
|
[source,csharp]
|
|
----
|
|
public void DoSomething(List<string> strings) {
|
|
var sb = new StringBuilder();
|
|
sb.Append("Got: ");
|
|
foreach(var str in strings) {
|
|
sb.Append(str).Append(", ");
|
|
// ...
|
|
}
|
|
logger.LogInformation(sb.ToString());
|
|
}
|
|
----
|
|
|
|
=== Exceptions
|
|
|
|
No issue is reported when `StringBuilder` is:
|
|
|
|
* Accessed through `sb.CopyTo()`, `sb.GetChunks()`, `sb.Length`, or `sb[index]`.
|
|
* Passed as a method argument, on the grounds that it will likely be accessed through a `ToString()` invocation there.
|
|
* Passed in as a parameter to the current method, on the grounds that the callee will materialize the string.
|
|
* Retrieved by a custom function (`var sb = GetStringBuilder();`).
|
|
* Returned by the method.
|