A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔增阳 中级黑马   /  2014-3-26 19:58  /  1004 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 崔增阳 于 2014-3-28 21:07 编辑

class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }

        public Person(string name, int age)
        {
            Name = name;
            Age = age;
        }
        public Person(){}

        public void Display()
        {
            Console.WriteLine("Name: {0}, Age: {1}",Name,Age);
        }
    }


internal class Program
    {

        private static void Main(string[] args)
        {
            Person mel=new Person("Mel",23);
            Console.WriteLine("Before by ref call, Person is:");
            mel.Display();

            SendAPersonByReference(ref mel);
            Console.WriteLine("After by ref call, Person is:");
            mel.Display();

            Console.ReadKey();
        }

        static void SendAPersonByReference(ref Person p)
        {
            p.Age = 555;
            p=new Person("Nikki",999);
        }
    }


程序输出是:
Before by ref call, Person is:
Name: Mel, Age: 23
After by ref call, Person is:
Name: Nikki, Age: 999


谁能帮我解释一下程序输出?

3 个回复

倒序浏览
  1.             Person mel = new Person("Mel", 23);// 新建一个Name="Mel"并且Age=23的Person对像
  2.             Console.WriteLine("Before by ref call, Person is:");
  3.             mel.Display(); // 输出mel的Name和Age属性:Name: Mel, Age: 23

  4.             SendAPersonByReference(ref mel);// 调用SendAPersonByReference方法
  5.             Console.WriteLine("After by ref call, Person is:");
  6.             mel.Display();// 再次输出mel的Name和Age属性:Name: Nikki, Age: 999
复制代码
回复 使用道具 举报
  1.             Person mel=new Person("Mel",23);
  2.             Console.WriteLine("Before by ref call, Person is:");
  3.             mel.Display();
复制代码

调用类的构造函数,将mel对象Name属性初始化为"Mel",Age属性初始化为23,所以第一次输出为:
Name: Mel, Age: 23

  1.         static void SendAPersonByReference(ref Person p)
  2.         {
  3.             p.Age = 555;
  4.             p=new Person("Nikki",999);
  5.         }
复制代码

方法中对传入的Person类型引用赋予新值(对象名其实就是一个引用),将其指向一个Name属性为"Nikki",Age属性为999的新对象,所以第二次输出为:
Name: Nikki, Age: 999


函数参数加ref修饰符,就是显式指定该参数传递引用,但是个人觉得这对于类对象是不必要的,因为类本身就是引用类型。
回复 使用道具 举报
我想楼主真正不懂的应该是最后面的那句: p=new Person("Nikki",999);
当程序走到SendAPersonByReference(ref mel);时,
会跳到 static void SendAPersonByReference(ref Person p)
        {
            p.Age = 555;//这里Age变成了555
            p=new Person("Nikki",999);//注意这个,p又得到了新的值.
        }
如果还是看不懂
建议楼主用F11单步调试,就能发现其中的奥秘,以后这样的问题都能用单步调试解决哦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马