2008-10-29 39 views
1

我有以下有意平凡函數:索引到C#中的字符串作爲L值

void ReplaceSome(ref string text) 
{ 
    StringBuilder sb = new StringBuilder(text); 
    sb[5] = 'a'; 
    text = sb.ToString(); 
} 

這似乎是低效率的將其轉換爲一個StringBuilder索引到和替換的某些字符只將其複製回ref'd參數。是否可以直接將文本參數索引爲L值?

或者我該怎麼改善呢?

回答

3

C#字符串是 「不可改變的」,這意味着它們不能被修改。如果你有一個字符串,並且你想要一個類似但不同的字符串,你必須創建一個新的字符串。像以上那樣使用StringBuilder可能與任何方法一樣容易。

-1

我不知道這是否更有效,但它的工作原理。無論哪種方式,你必須在每次更改後重新創建字符串,因爲它們是不可變的。

string test = "hello world"; 
    Console.WriteLine(test); 

    test = test.Remove(5, 1); 
    test = test.Insert(5, "z"); 

    Console.WriteLine(test); 

或者,如果你想讓它更簡潔:

string test = "hello world".Remove(5, 1).Insert(5, "z"); 
+0

我真的好奇......爲什麼有人downmod這個?把我放直! – 2008-10-29 00:31:52

-1
text = text.Substring(0, 4) + "a" + text.Substring(5); 

比你的StringBuilder的解決方案不顯着不同,但略低於刪除(),插入()答案更簡潔。

3

用Reflector和反編譯的IL武裝 - 在純LOC的基礎上,那麼StringBuilder方法肯定是最有效的。例如追蹤StringBuilder內部調用的IL調用,以及IL調用String :: Remove和String :: Insert等。

我不會爲測試每種方法的內存開銷而煩惱,但會想象它會在與反射器結果一致--StringBuilder方法將是最好的。

我想事實StringBuilder的具有使用構造

StringBuilder sb = new StringBuilder(text); 

將全面幫助過的一組內存大小。

像其他人所說的,它會降低可讀性與效率...