黑马程序员技术交流社区
标题:
一个小程序
[打印本页]
作者:
崔增阳
时间:
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
Person mel = new Person("Mel", 23);// 新建一个Name="Mel"并且Age=23的Person对像
Console.WriteLine("Before by ref call, Person is:");
mel.Display(); // 输出mel的Name和Age属性:Name: Mel, Age: 23
SendAPersonByReference(ref mel);// 调用SendAPersonByReference方法
Console.WriteLine("After by ref call, Person is:");
mel.Display();// 再次输出mel的Name和Age属性:Name: Nikki, Age: 999
复制代码
作者:
鬼鬼
时间:
2014-3-26 21:20
Person mel=new Person("Mel",23);
Console.WriteLine("Before by ref call, Person is:");
mel.Display();
复制代码
调用类的构造函数,将mel对象Name属性初始化为"Mel",Age属性初始化为23,所以第一次输出为:
Name: Mel, Age: 23
static void SendAPersonByReference(ref Person p)
{
p.Age = 555;
p=new Person("Nikki",999);
}
复制代码
方法中对传入的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