2013-03-01 49 views
-2

我有這三個林斯代碼究竟內部發生

int i = 5; 
object a = i; 
i += 1; 

我想的值也將是6,但它是5

實際發生的,請清除它

+3

文檔沒有回答什麼? http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx – 2013-03-01 12:14:39

+0

@ ta.speot.is是什麼讓你覺得他知道拳擊的一切? – pescolino 2013-03-01 12:30:46

回答

2

當你

object a = i; 

的整數i是 「盒裝」(見Boxing and Unboxing (C# reference guide)),並將i的COPY放入框中。因此,更改原始i將不會影響a,這就是爲什麼當您檢查它時看到它保持不變。

2

值類型是副本。

基於值類型的變量直接包含值。 將另一個值類型變量分配給另一個值,將其中包含的 值複製到另一個值類型變量。這與引用類型變量 的賦值不同,後者將引用複製到對象而不是對象本身。

Value Types (C# Reference)

0

賦值運算符是如何工作取決於是否將你複製參考類型。基本類型和結構體,如int,是值類型,而對象是引用類型。

當你這樣做:

int i = 5; 
object a = i; 
i += 1; 

您的5值複製到堆棧並標記我。然後,在堆上創建對象a,並將其引用放置在堆棧上,並將i的值複製到對象a中。然後,i遞增1 - 堆中對象a的內容沒有改變。

這裏有一個不同的例子,可能使差別更加清晰:

class test{ 
     static void Main(string[] args) 
     { 
      Value i = new Value(5); 
      Value a = i; 
      i.number += 1; 
      Console.WriteLine(i.number); 
      Console.WriteLine(a.number); 
     } 
} 
public class Value 
{ 
     public Value(int x){number = x;} 
     public int number { set; get; } 
} 

在這個例子中這兩個對象將打印作爲6號的價值,因爲現在是我的參考。如果您不確定某個對象是否是對另一個對象的引用,則始終可以使用ReferenceEquals()方法。