2012-04-06 76 views
0

什麼是針對以下行爲的C#語言規範。屬性的值將保留,但新實例(null或new對象)不會更新爲實際參數。除了改變它指向的對象之外,它基本上是作爲ref的函數。將對象設置爲空而不傳遞它參考

在主函數的對象仍然完好無損(不爲空),但字符串屬性已更改爲「Hello World」

class Program 
{ 
    class MyClass 
    { 
     public string str; 
    } 

    static void MyMethod(MyClass obj) 
    { 
     obj.str = "Hello World"; 
     obj = null; 
    } 

    static void Main(string[] args) 
    { 
     MyClass o = new MyClass(); 
     o.str = "Hello"; 
     Console.WriteLine(o.str); 
     MyMethod(o); 

     Console.WriteLine(o.str); // prints "Hello World" 
    } 
} 
+5

究竟是什麼問題?你期望什麼與實際發生的事情? – 2012-04-06 10:49:15

+0

上面是否真的打印出「Hello World」(它不應該)或者它是做什麼的? – MoonKnight 2012-04-06 11:14:01

+0

我更新了這個問題,請看看 – sarat 2012-04-07 17:27:59

回答

3

在.NET語言,對象引用是按值傳遞。

那麼這是什麼意思?從概念上你的代碼是一樣的,因爲這與作出了明確的指針:

static void MyMethod(MyClass *obj) 
{ 
    obj->str = "Hello World"; 
    obj = NULL; 
} 

static void Main(string[] args) 
{ 
    MyClass *o = new MyClass(); 
    o->str = "Hello"; 
    Console.WriteLine(o->str); 
    MyMethod(o); 

    Console.WriteLine(o->str); // prints "Hello World" 
} 

傳遞給MyMethod的參數是指針o的值,指向MyClass實例。您可以取消引用指針來設置str的值,但將實際指針值設置爲null不會影響調用方法中的變量。

您可以通過這樣按引用傳遞的參考:

什麼是對以下行爲C#語言規範。屬性的值將保留,但新實例(null或new對象)不會更新爲實際參數。除了改變它指向的對象之外,它基本上是作爲ref的函數。

class Program 
{ 
    class MyClass 
    { 
     public string str; 
    } 

    static void MyMethod(ref MyClass obj) 
    { 
     obj.str = "Hello World"; 
     obj = null; 
    } 

    static void Main(string[] args) 
    { 
     MyClass o = new MyClass(); 
     o.str = "Hello"; 
     Console.WriteLine(o.str); 
     MyMethod(ref o); 

     Console.WriteLine(o.str); // throws NullReferenceException, o is now null 
    } 
} 
2

您傳遞的對象值作爲參考。這使您可以更改對象中屬性的值,並且可以在調用方法中看到更改。不過,在調用方法中不會看到變量obj引用的變化。

如果您希望變量引用在整個過程中都被更改,您需要通過引用傳遞引用。要做到這一點,你應該改變方法聲明:

static void MyMethod(ref MyClass obj){...} 

對裁判的文檔可以發現here