2015-08-18 14 views
-3

後保持不變據我所知字符串是引用類型,當你發送一個引用類型的功能,如果你改變它的價值,原始對象的值會發生變化,但爲什麼當我打電話更改功能原始字符串保持不變。但是當我有一個類的對象並將其發送給一個函數時,它的原始值將會改變。這裏有一個例子:爲什麼字符串值保持調用函數

static void Main(string[] args) 
    { 
     string x = "Hi"; 
     Change(x); 
     Console.WriteLine(x); 

     var y = new Test(); 
     y.Str = "Hi"; 
     Change(y); 
     Console.WriteLine(y.Str); 

     Console.ReadKey(); 
    } 
    static void Change(string str) 
    { 
     str = "Test"; 
    } 
    static void Change(Test x) 
    { 
     x.Str = "Test"; 
    } 

輸出是「Hi」,而不是「測試」的字符串,但對測試對象是「測試」

+4

字符串是不可變的 –

+2

@TimSchmelter真的,但它不是這個特定問題的答案。 –

+0

https://msdn.microsoft.com/en-us/library/0f66670z.aspx – SquidScareMe

回答

1

因爲你改變這是該參數的值通過了,而不是原來的價值。

str在您通過時成爲x的副本。更改該值對存儲在x中的值沒有影響。

編輯:好吧,這是一個過於簡單的解釋,但指出,更好的解釋已經上市。蒂姆的權利,字符串是不可變的,所以你不能改變存儲在該引用中的字符串的內容,你只能用新的字符串替換它,但除非你明確指定參數爲'ref',否則不能改變方法內的引用。

+0

字符串是引用類型,因此我通過的是一個引用而不是值 – EO102030

+2

這個問題已經在SO上多次提出。使用Google。一個例子是:http://stackoverflow.com/questions/1069155/is-string-a-value-type-or-a-reference-type – dotNET

+0

但是一個不可變的引用類型,字符串是特殊的,因爲一些API函數允許你傳遞null。 –

0

嘗試傳遞字符串與關鍵字ref

static void Change(ref string str) 
{ 
    str = "Test"; 
} 
+0

我知道這將工作,我的問題是爲什麼沒有參考不起作用 – EO102030

3

這不只是字符串,你也無法改變的對象是新的對象,即,這是不行的:

static void Change(ClassA aObj) 
{ 
    aObj = new ClassA(); // Won't hold when you leave the function 
} 

的原因是,你是值傳遞這些參數的參考。這意味着你可以看到和弄亂那裏的東西,但你不能改變它指向內存中的新參考插槽。

爲了解決這個問題,你需要使用ref/out關鍵字。

如需更詳細的解釋,請閱讀this

0

當調用變化(字符串str)方法一個新的參考(變量)被創建並分配其被作爲參數傳遞的x的值。當方法改變時,x不受影響,因爲它們是兩個獨立的引用。

Try Change(ref string str)

0

首先,字符串是不可變的。他們不能改變。其次,由於string是一個引用類型,所以你通過「引用」傳遞了這個字符串。賦值方法參數不會改變引用的值,它只會特別改變這個字符串的值。您可以使用ref來引用字符串位置而不是其值。

public void Change(ref string str) 
{ 
    str = "New String"; 
} 
相關問題