using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace three6
{
internal class Program
{
static void Main(string[] args)
{
MyClass a1 = new MyClass();
Console.WriteLine($"Before method call:{a1.val}");//20
RefAsParameter(ref a1);//引用
Console.WriteLine($"After method cala:{a1.val}");//20
}
static void RefAsParameter(ref 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;
}
}
为什么第四个输出是20?
1、ref 在方法签名和方法调用中,通过引用将参数传递给方法;
2、在RefAsParameter()方法开始的时候,实参和形参指向堆中相同的对象;
3、将成员进行重新赋值之后,还是会指向相同的对象,同时会影响到实参和形参;
4、当方法重新赋值之后,实参和形参的引用还是会指向该新的对象
5、在方法结束之后,实参指向在方法内创建的新对象
结论:
如果在方法内创建一个新对象并赋值给形参,在方法结束之后该对象还是会存在,并且是实参所引用的值