作者cplusplus (C++)
看板C_Sharp
标题Re: [心得] StringBuilder清除方式
时间Mon Apr 3 19:08:16 2006
: 3.接着,使用StringBuilder来模拟断行,不要又臭又长, 空白放最後:
: StringBuilder sql = new StringBuilder();
: sql.AppendFormat("SELECT UserId, UserName ");
: sql.AppendFormat("FROM table1 ");
: sql.AppendFormat("WHERE UserId=23 AND Enabled=1");
: sqlCommand.CommandText = sql.ToString();
: 发现了吗? 使用StringBuilder不仅能有效能,又能在观看上断行
: 每一行且又随时加入变化换值。
: 甚至,你能写个code snippet产生器,快速产生这类的程式码
: 都比string更整齐多变化。
: 另外,StringBuilder在.Net 2.0不提供Clear()函式
: 请善用 sb.Length = 0 来达到效果
: 它在大量资料测试时发现,能拥有立即删除内容的高效能
: 不要用 sb.Remove(0, sb.Length);
也可以用一些wrapper把StringBuilder包起来使用
然後override operator+ 就可以方便的使用
举个例子 (临时写的东西 只是举例用)
class ConviString
{
private StringBuilder sb=new StringBuilder();
public static ConviString operator+(ConviString cs,
string s){
cs.sb.Append(s);
return cs;
}
public static ConviString operator+(ConviString cs,
object o){
cs.sb.Append(o);
return cs;
}
public static implicit operator string(ConviString cs){
return cs.ToString();
}
public override string ToString(){
return sb.ToString();
}
public int Length{
get{return sb.Length;}
set{sb.Length=value;}
}
static public ConviString New{
get{return new ConviString();}
}
};
String result=ConviString.New+1+2+3+4+5+6+7+8;
//new ConviString()+1+2+3+4+5+6+7+8;
Console.WriteLine(result);
result="";
for(int i=0;i<10000;i++)
result+=i; //slow
ConviString cs=ConviString.New;
for(int i=0;i<10000;i++)
cs+=i; //fast
cs.Length=0;
// 可以像下面那样写
cs += "SELECT UserId, UserName " +
"FROM table1 " +
"WHERE UserId=23 AND Enabled=1";
可以把所有StringBuilder提供的介面都用一份然後完全使用SB的功能
完全的wrapper 只是多加个 + 方便使用
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.115.217.14
※ 编辑: cplusplus 来自: 140.115.217.14 (04/03 19:09)
1F:→ cplusplus:PS 不过这个class在逻辑设计上很糟糕 请另外设计XD 04/03 20:40
2F:推 SmartGoose:好像懂了一点,学了不少,感谢 04/04 11:15
3F:推 tomex:另外wrapper就是比较麻烦点...况且SB可以重复使用不慢 04/04 17:24
4F:推 cplusplus:SB内建通用好沟通 wrapper就不行 除此之外wrapper还不错 04/05 00:59
5F:→ cplusplus:不过当然要设计得当~ wrapper其实也可以提供很多功能 04/05 01:01