当我将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;
}
}
}
答案 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 = null
或obj = new A()
或obj = instanceOfAnotherObject
为了能够更改对象,您需要更改方法签名并通过ref传递obj -
public static void Test(ref A obj)