首页 > 代码库 > 方法的传递机制---引用类型传递

方法的传递机制---引用类型传递

.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指向该对象

 

方法的传递机制---引用类型传递