2012-04-06 73 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