声明一个结构体类型的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);
1,1
2,2
2,2
2,2
和楼上一样,我估计前三个没有难度,你想考大家的是最后一个为什么是2,2吧?
自己理解的答案是:
1,1
2,2
2,2
2,2
实际vs运行的答案:跟上一样
楼主看下关注拆箱和装箱的知识,这个题目是clr vir c# 那本书上的吧
是的,开始看理解的不是很深,问下大家,关注的还是值类型和引用类型、线程栈和堆
@倾注:
((Point)o).Change(3, 3);
这个是不是最困惑的一个?
(Point)o 拆箱生成的对象在栈上,跟那个o对象没有任何的关系,o还是指向原先堆的地址,那边其实还是2,2
@chenping2008: 值类型都是在栈上分配内存,引用类型在堆上分配内存,那在CLR中值类型和引用类型具体指的是哪些类型?怎么区分?
@倾注: class声明的是类,stuct声明的是值类型, class继承自System.Object, struct继承自ValueType,而ValueType继承自System.Object
平时用的int,double,float,enum,DateTime都是值类型,string等,还有你自定义的类都是类类型
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