.Net里的方法是不能独立存在的,调用方法必须使用类或者对象作为主调用者。如果声明方法包含了形参声明,调用方法必须给这些形参指定参数值,调用方法时实际传递给形参的参数值被称为实参。
当引用类型作为参数传递到方法中是如何传递的呢?下面先看一下源码吧,猜猜输出的结果是什么?
namespace Test
{
class Program
{
static void Main(string[] args)
{
Person person = new Person();
SetPerson(person);
Console.WriteLine("UserName={0},Age={1}", person.UserName, person.Age);
Console.ReadKey();
}
static void SetPerson(Person person)
{
person.UserName = "kangye";
person.Age = 25;
person = null;
}
}
class Person
{
/// <summary>
/// userName字段
/// </summary>
private string userName;
/// <summary>
/// UserName属性
/// </summary>
public string UserName
{
get { return userName; }
set { userName = value; }
}
/// <summary>
/// age字段
/// </summary>
private int age;
/// <summary>
/// Age属性
/// </summary>
public int Age
{
get { return age; }
set { age = value; }
}
}
}
输出结果:UserName=kangye,Age=25
你猜到了吗?好多朋友会迷惑,我明明给SetPerson方法中的person赋值为null了,为什么还有值呢。
![]()
其实在传递的时候,实参复制了一份引用地址给了形参,在SetPerson栈区中person也是指向堆内存中的Person对象,当给Person属性赋值之后,将SetPerson的person赋值为null,null是不知道的意思,SetPerson栈区的person不在指向堆内存的Person对象,但是堆内存中的对象是存在的,因为main栈区的person指向该对象