为什么对象不更新为NULL

时间:2016-07-31 05:23:11

标签: c# object

当我将obj更新为null时,其输出为30,但没有异常,但是当我更新obj.Age = 25时,输出为25。

我不知道幕后发生了什么。 有人可以解释为什么会这样吗?

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 个答案:

答案 0 :(得分:2)

执行obj = null;时,不要将对象设置为null,而是将该对象的引用设置为null。与方法Test一样,参数是对传递对象的新引用,它不会影响obj中的Main引用,因此将obj设置为null Test中{}只对该方法产生影响 要执行/查看您想要的内容,您可能需要将Test的参数更改为ref参数,如此

public static void Test(ref A obj)

然后像这样调用Test

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

现在您实际上修改了obj方法的Main引用。

当您在obj.age = 25;Test时(当然没有在obj前面设置null),然后您修改与obj相同的对象在Main指向,所以在将age写入控制台时,您会看到25 这是可能的,因为它是通过引用传递的 - 如果您将A替换为例如int然后传递它,然后在Test中更改其值将不会反映在Main的输出中,因为整数按值传递。您可能会发现阅读此page及其后续页面

答案 1 :(得分:2)

注意方法签名 -

public static void Test(A obj)

该参数未作为ref传递。当引用类型作为参数传递时,不指定为ref。您可以更改对象中的属性值,但不能指定对象将其指向另一个内存位置。

简单来说,你做不到 - obj = nullobj = new A()obj = instanceOfAnotherObject

为了能够更改对象,您需要更改方法签名并通过ref传递obj -

public static void Test(ref A obj)