传递给 StringBuilder 构造函数的字符¶
ID: cs/stringbuilder-initialized-with-character
Kind: problem
Security severity:
Severity: error
Precision: high
Tags:
- maintainability
Query suites:
- csharp-security-and-quality.qls
将字符传递给 StringBuilder
的构造函数可能是想将该字符插入到字符串中。然而,实际上,字符值会被转换为整数并解释为内部缓冲区的初始容量,因此字符值不会被插入到字符串中。
示例¶
以下示例显示了一个 ToString()
方法,该方法用于格式化数组的内容。但是,表达式 new StringBuilder('(')
不会将字符 '('
添加到字符串 str
中,而只是初始化缓冲区的大小,因此生成的字符串不包含前导 '('
字符。
public override string ToString()
{
var str = new StringBuilder('('); // BAD: Character value.
for (int i = 0; i < values.Length; ++i)
{
if (i > 0) str.Append(',');
str.Append(values[i]);
}
str.Append(')');
return str.ToString();
}
请注意,另一方面,将字符传递给 Append()
则没有问题。
可以通过使用字符串初始化 StringBuilder
来解决此问题,这会将 "("
放在字符串的开头。
public override string ToString()
{
var str = new StringBuilder("("); // GOOD: String value.
for (int i = 0; i < values.Length; ++i)
{
if (i > 0) str.Append(',');
str.Append(values[i]);
}
str.Append(')');
return str.ToString();
}
建议¶
如果用于初始化缓冲区的字符是字符字面量,只需将其替换为相应的字符串字面量即可。因此,在我们的示例中,将 new StringBuilder('(')
替换为 new StringBuilder("(")
。如果该字符不是字面量值,请使用 ToString()
将其转换为字符串,或者使用对 Append()
的额外调用将该值插入到字符串中。
参考¶
MSDN:StringBuilder 类