我有以下有意平凡函數:索引到C#中的字符串作爲L值
void ReplaceSome(ref string text)
{
StringBuilder sb = new StringBuilder(text);
sb[5] = 'a';
text = sb.ToString();
}
這似乎是低效率的將其轉換爲一個StringBuilder索引到和替換的某些字符只將其複製回ref'd參數。是否可以直接將文本參數索引爲L值?
或者我該怎麼改善呢?
我有以下有意平凡函數:索引到C#中的字符串作爲L值
void ReplaceSome(ref string text)
{
StringBuilder sb = new StringBuilder(text);
sb[5] = 'a';
text = sb.ToString();
}
這似乎是低效率的將其轉換爲一個StringBuilder索引到和替換的某些字符只將其複製回ref'd參數。是否可以直接將文本參數索引爲L值?
或者我該怎麼改善呢?
C#字符串是 「不可改變的」,這意味着它們不能被修改。如果你有一個字符串,並且你想要一個類似但不同的字符串,你必須創建一個新的字符串。像以上那樣使用StringBuilder可能與任何方法一樣容易。
我不知道這是否更有效,但它的工作原理。無論哪種方式,你必須在每次更改後重新創建字符串,因爲它們是不可變的。
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");
text = text.Substring(0, 4) + "a" + text.Substring(5);
比你的StringBuilder的解決方案不顯着不同,但略低於刪除(),插入()答案更簡潔。
用Reflector和反編譯的IL武裝 - 在純LOC的基礎上,那麼StringBuilder方法肯定是最有效的。例如追蹤StringBuilder內部調用的IL調用,以及IL調用String :: Remove和String :: Insert等。
我不會爲測試每種方法的內存開銷而煩惱,但會想象它會在與反射器結果一致--StringBuilder方法將是最好的。
我想事實StringBuilder的具有使用構造
StringBuilder sb = new StringBuilder(text);
將全面幫助過的一組內存大小。
像其他人所說的,它會降低可讀性與效率...
我真的好奇......爲什麼有人downmod這個?把我放直! – 2008-10-29 00:31:52