就是这两句:s = new Student("li4");
//s.Name = "li4";
s = new Student("li4");的话就输出zhang3s.Name = "li4";的话就输出li4why????class Student
{
private string name; public string Name
{
get { return name; }
set { name = value; }
} public Student(string _name)
{
name = _name;
}
static void Main()//Main_4_3_4
{
Student s = new Student("zhang3");
ChageName(s);
Console.WriteLine(s.Name);
Console.Read();
} static void ChageName( Student s)
{
s = new Student("li4");
//s.Name = "li4";
}
}
//s.Name = "li4";
s = new Student("li4");的话就输出zhang3s.Name = "li4";的话就输出li4why????class Student
{
private string name; public string Name
{
get { return name; }
set { name = value; }
} public Student(string _name)
{
name = _name;
}
static void Main()//Main_4_3_4
{
Student s = new Student("zhang3");
ChageName(s);
Console.WriteLine(s.Name);
Console.Read();
} static void ChageName( Student s)
{
s = new Student("li4");
//s.Name = "li4";
}
}
解决方案 »
- 急:一条新闻信息,title字段提交数据库总是被添加内容,sqlserver2000数据库
- Winform windows.services的Timer怎么启用?
- 如何利用C#实现回收站文件还原
- 不用父子窗体的关系这里应该怎样写 多谢各位了
- 不会做,很痛苦,新手都这样吗?
- 吐血相送:最后一分了!如何让窗打开时就自动隐藏?我在load事件里写this.Hide()没用,可是通过按钮点击使之this.Hide()就有用,为什么?
- C#和SQL开发的软件,如何打包可以在不安装SQL的电脑上使用
- winform 打印水晶报表 各位看看这是为什么?
- DevExpress 汉化包,在设计期怎么使用?
- 菜鸟提问:关于存储过程的问题在线等(-_-!)
- 求助 ~~~~DataGridView 中 我想将数据先更新到DataTable 中, 然后再更新数据库, 怎么实现? ~~~~~在线等侍!!!!!!!
- [攒分贴]每日小知识
{
s = new Student("li4"); // 生成新的副本,不会传递回调用的函数。
//s.Name = "li4"; // 没有生成新的实例,对传递进来的s赋值。
}
{
Student s = new Student("zhang3");
ChageName(ref s);
Console.WriteLine(s.Name);
Console.Read();
} // 加上ref,就会改变传递进来的s。
static void ChageName(ref Student s)
{
s = new Student("li4");
}
引用类型的按值传递不应该改变s实例啊......
也就是说
s = new Student("li4");
s.Name = "li4";
两句都应该不改变s啊....
why not?
{
s = new Student("li4");
}这时:是把原本指向zhang3的s指向了li4而下面:
static void ChageName( Student s)
{
s.Name = "li4";
}这个型参s和实参s是指向同一个zhang3,而这样一操作就变成了li4
请大家看一下解释的对不对
对的话就结贴了
------
不对...new Student("li4")产生新的实例...它和你“原本指向zhang3的s”没有任何关系...3、4楼解释的很清楚了...
3楼说得没错,你把Main方法的 Console.WriteLine(s.Name)语句放到 ChageName方法里再跑一遍看看区别就知道了
{
s = new Student("li4");
}型参和实参原本都指向zhang3,运行s = new Student("li4");之后型参指向了li4,而实参仍然指向zhang3而下面:
static void ChageName( Student s)
{
s.Name = "li4";
}这个型参s和实参s是指向同一个zhang3,而这样一操作,实例的Name属性就从zhang3变成了li4
请大家看一下解释的对不对
我觉得这样解释似乎是和3、4L一致的
[/Quote]
{
s = new Student("li4"); // 生成新的副本,不会传递回调用的函数。
//s.Name = "li4"; // 没有生成新的实例,对传递进来的s赋值。
}这个是正确的
class Student
{
private string name; public string Name
{
get { return name; }
set { name = value; }
} public Student(string _name)
{
name = _name;
}
static void Main()//Main_4_3_4
{
Student s = new Student("zhang3");
ChageName(out s);
Console.WriteLine(s.Name);
Console.Read();
} static void ChageName(out Student s)
{
s = new Student("li4");
//s.Name = "li4";
}
}参数加上out关键字就行
我知道ref或者out是按引用传参
我主要是问一下12楼的解释对不对啊...
你传进来的是一个引用(类似于c++地址),你只能改变这个引用的对象的值,不能改变这个引用本身。
所以:s=new() 新new的是传不出去的。
{
s = new Student("li4");
//s.Name = "li4";
}
中的s对象的作用域(生命周期)仅限此方法中
原主函数中的不是同一个s.可能这么理解它们之间没关系的.
static void ChageName(Student s) //形参是在栈上的实参的拷贝,和实参指向的是堆上的同一块区域。
{
s = new Student("li4"); //形参声明对象,形参指向新的地址,而是参没有变化
//s.Name = "li4"; //形参的Name变化,因为形参和实参指向的是堆上的同一块区域,所以形参的Name变化,同时实参的Name也变化
}所以会出现楼主的结果。可以用ref / out进行强制引用
所以s对象是个副本,对它的修改不会影响到Main()中的s变化的.如果想变化就用ref关键字把s作引用参数传递.
http://dev.yesky.com/msdn/47/3494047.shtml