2012-02-01 23 views
4

使用SubString()方法創建字符串時,得到的字符串是原始字符串元素的副本(因此現在有2個具有相同信息的存儲器位置),還是對現有內存位置的引用?String.Substring():複製或引用?

如果它是一個副本,有沒有辦法讓它成爲一個參考呢?

回答

5

在C#中的字符串是不可改變*不是永久性。這意味着作爲SubString方法的結果的新字符串與舊字符串不共享公共部分。 Here是Eric Lippert的美麗解釋。

*對字符串的操作將返回新的字符串對象

5

這是一個副本,你不能有一個string這是對另一個字符串的一部分的引用。 .net字符串不支持數組,它包含char數據內聯。即它是一個可變長度類,類似於一個數組。

雖然這個子參考模型是一個可能的實現(我認爲java字符串只是char數組中的切片),但它可能會導致奇怪的行爲,其中保留一個小的子字符串將整個字符串保留在內存中, Java子串。我想.NET設計師想避免這樣的問題。

你可以使用你自己的字符串類型具有這個屬性。例如,您可以使用ArraySegment<char>將片段處理成char數組。

0

這是一個新的字符串。你可以剔除那些表示保存其他字符串的開始和結束位置的東西,例如,如果你調用它,你會發送給子字符串的參數。 如果它是一個固定的模式(或者至少可以固定一個已知的時間間隔,你可以提前切斷它,或者使用StringBuilder,或者使用TextReader的Stream。

我會說如果substring是一個問題用一種不變的字符串的語言,你應該設計出它的需要。它很方便,但它應該是一個一個。