传递给 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 类