using System;public class Test1{ public static void Main() { int num = 0; Person p = new Person("Li"); A1(p, num); Console.WriteLine("{0},{1}", p.name, num); } static void A1(Person p, int num) { p = new Person("Wang"); num = 1; }}public class Person{ public string name; public Person(string name) { this.name = name; }}
关键是分析这个函数:A1(Person p, int num) P是以引用形式传进来的,num是以值形式传进来的,所以在Al()中对num的修改不会返回到调用Al()的函数中; Al()函数中的p是引用,所以对P的修改会影响p的值,但引用也是复制后传到Al()函数中的,所以对P的副本重新赋值不会影响到p,但对p副本的属性赋值会影响到p,这大概就是引用; [解决办法] 10人都答错?不可能吧。 [解决办法] 看来还是没有理解引用传递及值传递 [解决办法] 怎么可能呢?LZ是哪个公司的?还招人不。 [解决办法] Li 0 [解决办法] int num = 0; Person p = new Person("Li"); A1(p, num);
using System;public class Test1{ public static void Main() { int num = 0; Person p = new Person("Li"); A1(p, num); Console.WriteLine("{0},{1}", p.name, num); } static void A1(Person p, int num) { p.name = "Wang"; num = 1; }}public class Person{ public string name; public Person(string name) { this.name = name; }} [解决办法] 学习+接分 [解决办法] 好多人学习都不注重基础的,都是拿来就用,不知就里 [解决办法] jf来的 [解决办法] 亡灵 [解决办法] up [解决办法] 悄悄的路过
using System; public class Test1 { public static void Main() { int num = 0; Person p = new Person("Li"); A1(p, num); Console.WriteLine("{0},{1}", p.name, num); } static void A1(Person p, int num) { p.name = "Wang"; num = 1; } } public class Person { public string name; public Person(string name) { this.name = name; } } 如果改成这样,输出Wang, 0 此时,A1中引用的是p的地址,所以当p值改变后,Main中的p也变。 [解决办法] 靠,我居然错了。深刻反醒!!!
我的天啊! [解决办法] mark [解决办法] Li 0 这个以前我也遇到过 [解决办法] 学习一下。 [解决办法]
[解决办法] LI 0 传递 引用的知识 [解决办法] 前面的大牛们都说了. 其实可以这样理解咯: 对一个引用对象,引用的指针(p1)放在栈,指针所指向的是对象内容放在堆. 调用一个函数, 这时,会在栈上把p1复制一份(值复制),形成p2,同样,p2和p1一样也是指向堆中同一个地址的. 即在 static void A1(Person p, int num) { p = new Person("Wang"); num = 1; } 中,参数Person p,即为p2, p2 = new Person("Wang"); 使p2指针指向了一个新申请的堆中的位置. 结果,p2的值变了.p1的值没有变. 所以,主函数: Console.WriteLine("{0},{1}", p.name, num); 时,p.name,即为p1所指向的内容.所以是 li
不知我理解得对不对?
[解决办法] 好题,学习! [解决办法] 学习 [解决办法] Li 0
是值传递
加ref就传地址 [解决办法] 其实这两个参数都是值传递,num就不用说了,它是值类型,所以传递到方法中的是它的副本,而p是引用类型,但是它没有加ref或者out,所以它是以值传递引用类型,引用类型的变量不直接包含其数据;它包含的是对其数据的引用。当通过值传递引用类型的参数时,有可能更改引用所指向的数据,如某类成员的值。但是无法更改引用本身的值;也就是说,不能使用相同的引用为新类分配内存并使之在块外保持。 在楼主的示例中,p为引用类型,在未使用 ref 参数的情况下传递给方法A1。在此情况下,将向方法传递指向p的引用的一个副本。但是在A1方法中使用 new 运算符来分配新的内存部分,将使A1中的p引用新的Person,因此,这之后的任何更改都不会影响原始Person p(它是在 Main 内创建的)。实际上,本示例中创建了两个Person对象,一个在 Main 内,一个在 A1 方法内 [解决办法]
这里传不传那个引用有什么区别啊,关键就在这儿!
有区别吗?所以说这个问题主要不是理解什么引用型,值类型传值的问题!
------解决方案--------------------
这里传不传那个引用有什么区别啊,关键就在这儿!
有区别吗?所以说这个问题主要不是理解什么引用型,值类型传值的问题!
[解决办法] 看看这个呢
C# code
using System; public class Test1 { public static void Main() { int num = 0; Person p = new Person("Li"); A1(ref p, num); Console.WriteLine("{0},{1}", p.name, num); Console.Read(); } static void A1(ref Person p, int num) { p = new Person("Wang"); num = 1; } } public class Person { public string name; public Person(string name) { this.name = name; } } [解决办法] 还在这纠缠不清...