今天犯了一个StringBuilder构造函数引起的二逼问题。

在.Net里,StringBuilder的构造函数有很多,最常用的是无参的构造函数,默认分配16个字符的空间。其次就是填写StringBuilder空间的带一个Int32的构造函数,这个在优化代码的时候也是会经常用到的,因为按照默认16个字符的空间,基本在操作时都会扩容。在可以确认操作容量的情况下,使用这个构造函数比无参构造函数更好。还有一个构造函数方法是带一个字符串参数的,就是以一个已有的字符串构建一个StringBuilder。今天就是栽倒在这构造函数上。

现在要拼接一个字符串,已经知道拼接的结果一定是以双引号开头的。于是就这么写了。

1 var buffer=new StringBuilder("\"");

这样写当然没什么错。但是接着就二逼了,心想,既然StringBuilder内部是一个字符数组,那么构造函数写成这样岂不是更好。

1 var buffer=new StringBuilder('\"');

这样就免去了内部将字符串的每一个字符复制到字符数组的步骤了。见语法提示也没错,心里大喜。

 

但后来一执行就蒙了,怎么输出的结果全缺了开头的双引号呢?

查了下,StringBuilder并没有以char作为参数的构造函数,而语法提示并没有错误,则说明参数被隐式转换了。那么转换到哪一个构造函数呢?char类型是可以隐式转换到int类型的,于是执行结果就变成了创建指定空间的StringBuilder了,因此结果也就缺少了开头的双引号了。

posted @ 2014-08-01 13:45  h82258652  阅读(661)  评论(0编辑  收藏  举报