-4
class C
{
    int a;
    int c=10;
    void F(C c1)
    { 
        c1.a = 30;
        c1 = null;
    }

    public static void Main(string[]args)
    {
        C c1 = new C();
        c1.a = 10;
        c1.F(c1);          
        Console.WriteLine(c1.a);
        Console.WriteLine(c1);
    }
}
4

3 回答 3

1

c1在您的情况下,它不是一个alias新的局部变量,而是按值传递引用的新局部变量。

所以,c1.a=55;会起作用,但c1=null;只会使局部变量 c1 无效,而不是您的原始变量..


要获得所需的行为,请通过reference

c1.F(ref c1);

你的方法应该是

void F(ref C c1)
{ 
    c1.a = 30;
    c1 = null;
}
于 2013-10-24T08:52:13.390 回答
0

不,您不是在“清空”一个对象,而是在清空对它的引用。当您分配时c1 = null,您只需将对该对象的一个​​特定引用设置为 null,而保持另一个引用 (in Main) 不变。

于 2013-10-24T08:52:04.503 回答
0

我已将参数重命名为“arrrgghhh”以显示正在发生的事情。您给它们两个相同的名称,但这并不会使它们成为相同的变量。它们都指向同一个对象,但如果你为空 arrrgghhh 它不会为空 c1。即使 arrrgghhh 不再存在, c1 仍将指向该对象。

class C
{
    int a;
    int c=10;
    void F(C arrrgghhh)
    { 
        arrrgghhh.a = 30;
        arrrgghhh = null;
    }

    public static void Main(string[]args)
    {
        C c1 = new C();
        c1.a = 10;
        c1.F(c1);          
        Console.WriteLine(c1.a);
        Console.WriteLine(c1);
    }
}
于 2013-10-24T08:57:30.897 回答