using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace three5
{
internal class Program
{
static void Main(string[] args)
{
Myclass a1 = new Myclass();
Console.WriteLine($"Before method call:{a1.val}"); //20
RefAsParameter(a1);//实参
Console.WriteLine($"After method call:{a1.val}"); //50
}
static void RefAsParameter(Myclass f1)//形参
{
f1.val = 50;
Console.WriteLine($"After member assignment: {f1.val}"); //50
f1 = new Myclass();
Console.WriteLine($"After new Object creation:{f1.val}");//20
}
}
class Myclass
{
public int val = 20;
}
}
一开始无法理解,为什么第四个输出会是50?
1、第一个输出是20;
2、实参和形参同时指向20,进入方法体里面,对象的成员重新赋值之后,实参和形参仍然指向堆中的数据50;
3、当方法里分配新的对象并赋值给形参时,方法体外面的实参还是指向原对象,a1还是指向的是50,但是形参会指向新的对象
4、在方法调用之后,实参会指向原对象,形参和新对象都会消失
结论:
如果在方法内创建一个新的对象并赋值给形参,就会切断形参与实参之间的关联,并且在方法调用之后,新对象也会消失