這不只是該字符串是不可改變的,而且,雖然string
是引用類型,引用本身不是。也就是說,您通過引用傳遞string
,但引用本身是按值傳遞的。因此,對於引用類型,您可以修改參數所引用的對象(只要它是可修改的),但除非通過引用傳遞它,否則不能修改參數引用的內容。
所以,當你試圖改變string
變量指的是什麼:
str = tmpStr;
它改變了什麼str
是指在本地,但不影響什麼原始的參數localString
指。
它認爲這種方式,讓我們說,爭論localString
是指物體在位置1000:
localString
+---------------+ 1000
| 1000 | -----------------> +---------------+
+---------------+ | Count: 1 |
| Value: "" |
+---------------+
然後當我們通過localString
的方法,它會創建引用的副本(如str
)並更新引用計數...
localString
+---------------+ 1000
| 1000 | -----------------> +---------------+
+---------------+ | Count: 2 |
| Value: "" |
str +---------------+
+---------------+ ^
| 1000 | ---------------------+
+---------------+
然後,當你指派海峽到一個新的字符串,它修改參考str
但不localString
:
localString
+---------------+ 1000
| 1000 | -----------------> +---------------+
+---------------+ | Count: 1 |
| Value: "" |
str +---------------+
+---------------+ 2500
| 2500 | ---------------------> +---------------+
+---------------+ | Count: 1 |
| Value: ... |
+---------------+
所以你的str
修改不僅改變是指,不是原來的refernce什麼str
localString
,如果你想改變那,那麼你通過引用傳遞,這意味着str
是一個引用回到原始參數(很像ptr到ptr):
localString
+---------------+ 1000
| 2500 | ------------------> +---------------+
+---------------+ | Count: 2 |
^ | Value: "" |
str | +---------------+
+---------------+
| |
+---------------+
現在,當你改變str
它改變了refernce localString
還有:
localString
+---------------+ 1000
| 1000 | -----+ +---------------+
+---------------+ | | Count: 0 |
^ | | Value: "" |
str | | +---------------+
+---------------+ | 2500
| | +----------------> +---------------+
+---------------+ | Count: 1 |
| Value: ... |
+---------------+
然後,當然,原始字符串(假設沒有其他物質是指它在這個例子中)可垃圾回收......
所以,如果你真的想修改string
參數,通過ref
或out
通過它,或者你可以返回新的突變形式,或以一個實例會員商店(雖然傳遞的實例 - 成員是更高的耦合順序,並可能導致其他問題......)。
此行爲是預期的,字符串是不可變的設計。看看這個:http://stackoverflow.com/questions/636932/in-c-why-is-string-a-reference-type-that-behaves-like-a-value-type –
什麼是Empty() '?我正在假設某種擴展方法? – Oded
你有沒有嘗試使返回類型爲字符串? – tehdoommarine