请进来BS我...而我BS【C#面试题,并散分】帖中的绝大多数人...

vrhero 2009-04-03 09:02:03
关于那个帖子,我不做任何说明,一字不差将其中部分内容转帖如下...大家自己看...

[Quote=引用楼主 youbl 的帖子:]
出了一个面试题,如下:
请写出下面代码的运行结果,并解释为什么?

C# codeusing 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;
}
}




10个人面试,10个人都回答错误,难道这题很难?
这是我在实际开发中遇到过的问题,所以列入了面试题中
你也来回答看看
并说说有没有必要面试这种题目[/Quote]

[Quote=引用 34 楼 namhyuk 的回复:]
经过五分钟多才理顺。天那!有些沮丧~本来很容易的问题。

这个根本不是理解引用传递和值传递的问题。实际上主要是变量作用域问题。
[/Quote]

[Quote=引用 40 楼 youbl 的回复:]
实际上就是引用传递和值传递的问题
对于引用类型,传递的是一个拷贝的地址,把这个拷贝的地址改变了,当然不影响原来的变量
但是对这个地址指向的东西进行了修改,自然也会影响到原来的变量

跟变量作用域有什么关系?
[/Quote]

[Quote=引用 57 楼 vrhero 的回复:]
lz的理解是错误的,这里哪里来的引用传递?以错考错,都是错...

C# code public static void Main()
{
int num = 0;
Person p = new Person("Li");//称其为p1...
A1(p, num);//p1引用的副本,不是p1了...
Console.WriteLine("{0},{1}", p.name, num);
}
static void A1(Person p, int num)//p1引用的副本...
{
p = new Person("Wang");//称其为p2...与p1不相干,与p1引用的副本也不相干...
num = 1;
}


知其然不知其所以然...同意39楼的意见...[/Quote]

[Quote=引用 71 楼 youbl 的回复:]
lz的理解是错误的,这里哪里来的引用传递?以错考错,都是错...
这里当然不是引用传递,但是一般我们称值类型以外的都是引用类型
这句话应该改一下:
实际上就是引用类型传递和值类型传递的问题 [/Quote]

[Quote=引用 77 楼 vrhero 的回复:]
难道.NET阵营如此鱼龙混杂真的是.NET门槛太低所致?...回去好好看看书或MSDN...

在C#中除非显式以ref或out声明才会按引用传递参数否则全是按值传递!不是说引用类型就会按引用传递!误区!至于后面的值类型...你还是认真学习吧...
[/Quote]

[Quote=引用 90 楼 ojlovecd 的回复:]
其实这两个参数都是值传递,num就不用说了,它是值类型,所以传递到方法中的是它的副本,而p是引用类型,但是它没有加ref或者out,所以它是以值传递引用类型,引用类型的变量不直接包含其数据;它包含的是对其数据的引用。当通过值传递引用类型的参数时,有可能更改引用所指向的数据,如某类成员的值。但是无法更改引用本身的值;也就是说,不能使用相同的引用为新类分配内存并使之在块外保持。
在楼主的示例中,p为引用类型,…[/Quote]

[Quote=引用 100 楼 youbl 的回复:]
没错,这个题目引出的问题和引用类型还是值类型确实毫无关系,这个我也知道,
因为太多人认为只要是引用类型,在方法里肯定就会改变值
所以我才出了这个题目,看应试者对引用类型的传递(不是引用传递)的理解

不知道你让我看那些答复有什么意义? [/Quote]

[Quote=引用 106 楼 youbl 的回复:]
是有矛盾,所以我后面改正了,改成是:引用类型传递和值类型传递的问题
[/Quote]

[Quote=引用 116 楼 vrhero 的回复:]
又回到这里了...说了多次了,这个题和“引用类型传递和值类型传递”没有关系,是你认为和它们有关系...在大家的提醒下,于是你摇身一变“所以我才出了这个题目,看应试者对引用类型的传递(不是引用传递)的理解”...

我可没什么好激动的,这个跟我更没关系...只是为那些应试者不值啊,虽然他们错了,却是错在同样错误的答案上...

错了要知道改,不要强辩...[/Quote]

[Quote=引用 183 楼 youbl 的回复:]
to:vrhero
你进行的修改我看了,还真以为你有什么好想法,如果是,我会虚心接受
无非是在我的题目基础上加了一个对引用类型的属性修改的语句,加了一些注释,没有任何新意,也只能让我bs你

我再次重申,我那道题目是对来面试的人进行笔试的试卷题之一,
其次因为是招外包的人,所以要求来了就能干活,没时间去培训技术知识

所以,笔试代码还加注释,写那么清楚,那我还考什么,直接告诉他,答案是什么什么就算了
更何况这个代码又不是长篇大论,只是简单几行,如果没注释就看不懂,
还能回答说是:wang,0的,只能说基础不够,无它 [/Quote]
...全文
1257 196 打赏 收藏 转发到动态 举报
写回复
用AI写文章
196 条回复
切换为时间正序
请发表友善的回复…
发表回复
lala9517 2009-04-09
  • 打赏
  • 举报
回复
刚刚调试了下
当p传到函数里的时候,虽然p的地址变了,但p.name的地址并没有变
因此,用p.name = "Wang";的时候改变的是原来p的成员变量的值.
如果用p = new Person("Wang");显然,p重新实例化之后p.name的地址已经改变,但原来的变量并没有变.

如果用指针来解释.应该可以这样理解.
类只是一个指针,将类传给函数的时候,函数取得这个指针的副本,但指针指向的位置并没有改变.
p = new Person("Wang");改变的是指针指向的地址.
p.name = "Wang";改变的是指针指向的值.
fly_to_sky 2009-04-09
  • 打赏
  • 举报
回复
寒~
liang4571231 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 vrhero 的回复:]
引用 5 楼 mengweilil 的回复:
何苦,何必呢。。。。

没什么意思...只是看到那个帖子误导了很多新人...有必要纠正一下...
[/Quote]

说得好,我代表新人非常感谢你!
r_swordsman 2009-04-09
  • 打赏
  • 举报
回复


还能回答说是:wang,0的,只能说基础不够,无它
运行一下就知道结果是 li,0

wonsoft 2009-04-09
  • 打赏
  • 举报
回复
还可以哦。
yanm7788 2009-04-09
  • 打赏
  • 举报
回复
Li,0
个人理解就是作用域.以前张孝祥的java基础里的题,很清楚的.
如果加上ref,out的话就可以相当如一个return了,值就传回来了.假如值没传如在同一方法是没法变的.
xiao_fan85 2009-04-09
  • 打赏
  • 举报
回复
呵呵,收藏起来吧
lirongxj 2009-04-08
  • 打赏
  • 举报
回复
tomiji我赞同你的看法
  • 打赏
  • 举报
回复
p = new Person("Wang");
p原来是new Person("Li")的引用
A1(p, num)这个函数只是重新生成了指向new Person("Wang")的p值

但是new Person("Li")还是存在啊,并没有改变new Person("Li")对象的引用p值

所以结果是 Li 0

阿非 2009-04-08
  • 打赏
  • 举报
回复
LZ, 淡定 ~ 淡定 ~



ZSW53362465 2009-04-08
  • 打赏
  • 举报
回复
[Quote=引用 154 楼 ZSW53362465 的回复:]
引用 46 楼 ft2515426 的回复:
请问要怎么才能显示出wang,1?
除static void A1(Person p, int num)
{
p = new Person("Wang");
num = 1;
Console.WriteLine("{0},{1}", p.name, num);
}用这个方法外

把num定义成全局
并且传 p 的时候用REF或OUT修饰
[/Quote]
似乎忘了,num也要用REF或OUT修饰……
哎……
Learn-anything 2009-04-08
  • 打赏
  • 举报
回复
lg
sjt000 2009-04-08
  • 打赏
  • 举报
回复
mark
ZSW53362465 2009-04-08
  • 打赏
  • 举报
回复
[Quote=引用 46 楼 ft2515426 的回复:]
请问要怎么才能显示出wang,1?
除static void A1(Person p, int num)
{
p = new Person("Wang");
num = 1;
Console.WriteLine("{0},{1}", p.name, num);
}用这个方法外
[/Quote]
把num定义成全局
并且传 p 的时候用REF或OUT修饰
ZSW53362465 2009-04-08
  • 打赏
  • 举报
回复
Li,0 - -!
看都看出来……
结果运行了一下,
哎呦喂~还真是Li,0
觉得我很强…………哇哈哈,
呵呵,乐一下,就是作用域的问题和会不会把引用传递和值传递弄混嘛
如果num是全局的
那结果为
Li,1
如果
A1(p, num);
这里改成
A1(ref p, num); 或A1(out p, num);
&&
static void A1( Person p, int num)
改成
static void A1(ref Person p, int num) 或static void A1( out Person p, int num)
结果为
Wang,0

ojekleen 2009-04-08
  • 打赏
  • 举报
回复
楼主把原帖地址发个,或许偶也在哪犯错了。。呵呵


犯错不要紧啊,只要肯认真。。。
hongn 2009-04-08
  • 打赏
  • 举报
回复
学习,留名
ojekleen 2009-04-08
  • 打赏
  • 举报
回复
这问题要在java区基本都会知道,在.net区却稀里糊涂的。。。


楼主是偶学习的榜样 。。。向楼主致敬。。。
matee 2009-04-08
  • 打赏
  • 举报
回复
呵呵..基本功的问题.
lzj4905 2009-04-08
  • 打赏
  • 举报
回复
学习了。
加载更多回复(175)

7,765

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧