2017-09-03 104 views
-1

的預期的值,請看看下面的代碼 -獲取對象

public class Program 
{ 

    public static void Main() 
    { 
    A ob = new A(); 
    ob.x = 120; 
    ob.Name = "No"; 
    GO(ob); 
    Console.WriteLine(ob.x); 
    } 

    public static void GO(A obj) 
    { 
    obj.x = 50; 
    obj.Name = "Local"; 
    obj = null; 
    } 
} 

在控制檯它打印X 50的值,但是當我使用ref關鍵字它給空引用異常。我的問題是如果對象是引用類型,它應該給予null引用異常,即使我不使用ref。如果不是,那麼控制檯中x的值應該是120.我無法理解這種行爲。請解釋當我們使用ref時和當我們不使用時發生的事情。

回答

1

當你傳遞一個參數的方法與ref關鍵字,不管你的操作它們反射回實際參數的方法內執行。在方法GO中,您將參數設置爲null。所以對象obConsole.WriteLine之前的值爲null,因此爲null引用異常。

同樣在相反的情況下,當您調用沒有ref關鍵字的方法時,將存儲在ob變量中的參考副本傳遞給該方法的參數obj。因此,無論obobj其在程序棧指向在堆相同的存儲器位置處的兩個不同的變量。這就是你可以在方法內修改x的值的方法。但obj值設置爲null不會改變的ob值。因此這裏沒有空引用異常。

+0

你是正確的,但對象作爲引用傳遞即使不使用裁判,這就是爲什麼x的值改爲50,但對象的值沒有設置爲null,控制檯打印50不是120麼?? – VIVEK

+0

檢查修改答案 –

+0

感謝您的回答。我也得到了更好的參考這個-HTTPS://stackoverflow.com/questions/186891/why-use-the-ref-keyword-when-passing-an-object – VIVEK