2016-07-31 131 views
4

當我更新我obj作爲null其輸出是30,但也不例外,但是當我更新obj.Age = 25輸出爲25爲什麼對象未更新爲NULL

我沒有收到所發生的事情背後的想法現場。 有人可以解釋爲什麼會發生這種情況嗎?

public class A 
{ 
    public int age; 
} 

class Program 
{ 
    public static void Test(A obj) 
    { 
     //obj = null; 
     //obj.age = 25; 
    } 

    static void Main(string[] args) 
    { 
     try 
     { 
      A obj = new A(); 
      obj.age = 30; 
      Test(obj); 
      Console.WriteLine(obj.age); 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 
} 

回答

2

通知的方法簽名 -

public static void Test(A obj) 

該參數不爲ref通過。當引用類型作爲參數傳遞時,不指定爲ref。您可以更改對象內的屬性值,但不能指定對象將其指向另一個內存位置。

簡單地說你不能做 - obj = nullobj = new A()obj = instanceOfAnotherObject

爲了能夠甚至改變對象,您需要更改方法簽名,並通過由參OBJ -

public static void Test(ref A obj) 
2

當你做obj = null;那麼你不設置對象爲null而是參考該對象null。如在您的方法Test中,參數是對傳遞對象的新引用,它不會影響Main中的obj引用,因此在Test中設置objnull僅對該方法有影響。
做/看你想你可能想的Test參數更改爲ref參數,像這樣

public static void Test(ref A obj) 

,然後調用Test像這樣

... 
A obj = new A(); 
obj.age = 30; 
Test(ref obj); 
... 

因爲現在你確實修改了什麼obj參考Main方法。


當你(沒有在它的前面設置objnull的過程),那麼你寫age你會看到控制檯時修改同一個對象objMain點等做obj.age = 25;Test 25.
這是可能的,因爲它通過引用傳遞 - 如果你用012代替Aint並通過該值,然後更改Test中的值將不會反映在Main的輸出中,因爲整數按值傳遞。您可能會發現閱讀本page和隨後的頁面,它有用