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
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
public void DoSomething(List<string> strings) {
foreach(var str in strings) {
// ...
}
}
or
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.