
这是 C#程序设计的例子,我在 VS2015 和 2013 上调试的输出结果和书上正好相反!我的输出是账号 001 余额 200 ,账号 002 余额 100 。
求大侠指点!
代码如下:
using System;
namespace P3_6
{
class Program
{
statc void Main(string[] args)
{
Account a1 = new Account() { ID = "001" };
EditAccount(a1);
a1.Query();
ChangeAccount(ref a1);
a1.Query();
}
static void EditAccount(Account a) { a.MOney= a.Money * 2; a = new Account() { ID = "002" }; } static void ChangeAccount(ref Account a) { a.MOney= a.Money * 2; a = new Account() { ID = "002" }; } } class Account { public string ID; public decimal MOney= 100; public void Query() { Console.WriteLine("账号{0} 余额{1}", ID, Money); } } }
1 domty 2015-10-29 21:37:56 +08:00 c#已忘干净 (ref {param})就是引用传递的话 结果应该就是你说的啊 |
2 breeswish 2015-10-29 21:40:00 +08:00 你输出的是正确的 |
3 zts1993 2015-10-29 21:49:58 +08:00 EditAccount 可以修改 a1 对象但是不能修改 a1 指向的对象。。 我觉得你可以曝光一下是什么误人子弟的书。。 |
4 xingo 2015-10-29 22:11:42 +08:00 上面两位把我想说的说完了,我想说的是 两个方法后面和那个 Account 类前面的那个括号能删除吗,看着好恶心哦(。 |
5 bdbai 2015-10-29 23:27:50 +08:00 via iPhone @xingo 你说的是 new Account() {} 的小括号?这个用于给构造函数传参的, C# 中不能省。 |
如果和 java 差不多,那么 a1 其实只是一个引用, EditAccount 只能修改 a1 指向的对象,而不能修改 a1 这个引用本身 |
8 asj 2015-10-30 09:43:11 +08:00 输出结果是正确的 起始: a1 = Account 1 {id: '001', money:100} -> EditAccount Account 1 {id: '001', money:200} Account 1' {id: '002', money:100} //退出 EditAccount 时被回收 a1 = Account 1 {id: '001', money:200} -> ChangeAccount Account 1 {id: '001', money:400} //退出 ChangeAccount 时被回收 Account 2 {id: '002', money:100} a1 = Account 2 {id: '002', money:100} 要得到你想要的结果,需要把 ``` a.Money = a.Money * 2; a = new Account() { ID = "002" }; ``` 这两句的顺序互换 |
10 mx1700 2015-10-30 13:26:36 +08:00 结果是正确的。 你可以理解为,直接传递对象的时候,其实是传递的对象引用的拷贝,他们指向同一个对象; 而 ref 传递的是引用本身。 所以第一个里边修改 a ,不影响外部,第二个会有影响。 |
11 doing 2015-10-30 16:39:38 +08:00 c#方法参数都是值传递,只是 在基本数据类型和引用类型作为参数的时候,这个值的数据有区别:一个是具体的值,一个是地址的引用。 然后加关键词 ref 只是把基本数据类型作为参数 值的传递方式 按照 引用类型作为参数的方式去传递数据 |