首页 新闻 搜索 专区 学院

大侠们:这串代码输出什么以及原因?不要拷到VS中运行!

0
[已解决问题] 解决于 2012-12-05 12:57

声明一个结构体类型的Point

 1   public struct Point
 2         {
 3             private int x;
 4             private int y;
 5             public Point(int _x, int _y)
 6             {
 7                 this.x = _x;
 8                 this.y = _y;
 9             }
10             public void Change(int _x, int _y)
11             {
12                 this.x = _x;
13                 this.y = _y;
14             }
15             public override string ToString()
16             {
17                 return string.Format("({0},{1})", this.x, this.y);
18             }
19         }

 

2、分布采取不同的操作后,会在控制台输出什么内容?

 1     Point p = new Point(1, 1);
 2             Console.WriteLine(p);
 3 
 4             p.Change(2, 2);
 5             Console.WriteLine(p);
 6 
 7             object o = p;
 8             Console.WriteLine(o);
 9 
10             ((Point)o).Change(3, 3);
11             Console.WriteLine(o);
倾注的主页 倾注 | 初学一级 | 园豆:56
提问于:2012-12-05 10:12
< >
分享
最佳答案
0

1,1    

2,2

2,2

2,2

和楼上一样,我估计前三个没有难度,你想考大家的是最后一个为什么是2,2吧?

奖励园豆:5
叶小党 | 菜鸟二级 |园豆:481 | 2012-12-05 10:39
其他回答(2)
1

自己理解的答案是:

1,1    

2,2

2,2

2,2

实际vs运行的答案:跟上一样

楼主看下关注拆箱和装箱的知识,这个题目是clr vir c# 那本书上的吧

chenping2008 | 园豆:9836 (大侠五级) | 2012-12-05 10:19

是的,开始看理解的不是很深,问下大家,关注的还是值类型和引用类型、线程栈和堆

支持(0) 反对(0) 倾注 | 园豆:56 (初学一级) | 2012-12-05 10:42

@倾注: 

((Point)o).Change(3, 3);
这个是不是最困惑的一个?
(Point)o 拆箱生成的对象在栈上,跟那个o对象没有任何的关系,o还是指向原先堆的地址,那边其实还是2,2
支持(0) 反对(0) chenping2008 | 园豆:9836 (大侠五级) | 2012-12-05 10:44

@chenping2008: 值类型都是在栈上分配内存,引用类型在堆上分配内存,那在CLR中值类型和引用类型具体指的是哪些类型?怎么区分?

支持(0) 反对(0) 倾注 | 园豆:56 (初学一级) | 2012-12-05 11:16

@倾注: class声明的是类,stuct声明的是值类型,    class继承自System.Object,                                           struct继承自ValueType,而ValueType继承自System.Object

平时用的int,double,float,enum,DateTime都是值类型,string等,还有你自定义的类都是类类型

支持(1) 反对(0) 叶小党 | 园豆:481 (菜鸟二级) | 2012-12-05 13:14
0

Point p = new Point(1, 1);
Console.WriteLine(p);      // 1,1
 
p.Change(2, 2);
Console.WriteLine(p);      //2,2

object o = p;                   //装箱, o 是一个新的引用类型的变量, 内部的值是当前p的值
Console.WriteLine(o);      //2,2   

Point q = ((Point)o);        //拆箱,  q是一个新的值类型的变量 - 与原来的o没关系了
q.Change(3, 3);
Console.WriteLine(o);      //o 还是 2,2

Console.WriteLine(q);      //新的q值 为 3,3

gunsmoke | 园豆:3592 (老鸟四级) | 2012-12-05 10:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册