2011-05-18 190 views
1

爲什麼b.b不會像f.f一樣變成「a2」?C#參考問題

謝謝。

public class Test 
{ 
    public static void Main() 
    { 
     Foo f = new Foo 
     { 
      f = getStr() 
     }; 

     Boo b = new Boo 
     { 
      b = f.f 
     }; 


     f.f = "a2"; 

     Console.WriteLine(f.f); 
     Console.WriteLine(b.b); 
    } 

    public static string getStr() 
    { 
     string a = "a1"; 
     return a; 
    } 
} 

public class Foo 
{ 
    public string f { get; set; } 
} 

public class Boo 
{ 
    public string b { get; set; } 
} 

回答

1

.NET中的字符串是不可變的,也就是說,您不是發送引用,而是發送值。

在.NET中的其他類中,您正在傳遞引用。就像這樣:

Car c = new Car(); 
c.Name = "Ford"; 
var d = c; 
d.Name = "Volvo"; 
c.Name; //Volvo 

但字符串,它是這樣工作:

string s = "Hey"; 
string c = s; 
c = "World!"; 
//s is still "Hey" 

看這個問題的詳細資料:Why .NET String is immutable?

它,當然,與其他相同類。

Car c = new Car(); 
c.Name = "Ford"; 
Car d = c; 
//d.Name == "Ford"; 
d = new Car(); 
d.Name = "Volvo"; 
//c.Name is still "Ford" 
1

Boo.bFoo.f是字符串,而不是指向字符串。
指定Foo.fBoo.bFoo.f的值賦值爲Boo.b。在完成任務後,他們是獨立的。更改Foo.f不會更改Boo.b

+0

實際上Boo.b和Foo.F_are_引用(指針)到字符串。 – 2011-05-18 09:25:48

+0

不在OP的意思,這就是爲什麼我沒有使用該單詞,而是單詞「指針」,而不是。 – 2011-05-18 09:30:08

0

爲什麼呢?你沒有改變它。僅僅因爲你在過去將b.b設置爲f.f,並不意味着它會隨着任何更改而繼續進行。

您設置了一個值,而不是引用。

3

這裏有一個簡單的代碼演示了什麼我想你期待看到:

string x = "hello"; 
string y = x; 
x = "there"; 

你似乎期待y"there"在這一點上。但是xy是完全獨立的變量 - 秒中的賦值僅將x(對字符串「hello」的引用)的值複製到y。第三行將不同的值分配給x(對字符串「there」的引用) - 它不會更改y的值,該值仍然是字符串「hello」的對象。

您的示例更復雜,因爲它使用具有自動實現屬性的單獨類型 - 但基本概念相同。