作者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)
→ cplusplus:PS 不過這個class在邏輯設計上很糟糕 請另外設計XD 04/03 20:40
推 SmartGoose:好像懂了一點,學了不少,感謝 04/04 11:15
推 tomex:另外wrapper就是比較麻煩點...況且SB可以重複使用不慢 04/04 17:24
推 cplusplus:SB內建通用好溝通 wrapper就不行 除此之外wrapper還不錯 04/05 00:59
→ cplusplus:不過當然要設計得當~ wrapper其實也可以提供很多功能 04/05 01:01