黑马程序员技术交流社区

标题: 一个小程序 [打印本页]

作者: 崔增阳    时间: 2014-3-26 19:58
标题: 一个小程序
本帖最后由 崔增阳 于 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


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


作者: mdb    时间: 2014-3-26 20:15
  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
复制代码

作者: 鬼鬼    时间: 2014-3-26 21:20
  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修饰符,就是显式指定该参数传递引用,但是个人觉得这对于类对象是不必要的,因为类本身就是引用类型。

作者: Doublekill    时间: 2014-3-26 21:54
我想楼主真正不懂的应该是最后面的那句: 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单步调试,就能发现其中的奥秘,以后这样的问题都能用单步调试解决哦




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2