C#面试题整理(1)
C#面试题整理(1)
2018-01-24 11:45 by 星门, … 阅读, … 评论, 收藏, 编辑
最近在看CLR VIA C#,发现了一些案例很适合来做面试题。特此整理:
public static void Main() { Int32 v = 5; Object o = v; v = 123; Console.WriteLine(v + ", " + (Int32)o); }
internal struct Point { private Int32 m_x, m_y; public Point(Int32 x, Int32 y) { m_x = x; m_y = y; } public void Change(Int32 x, Int32 y) { m_x = x; m_y = y; } public override string ToString() { return String.Format("({0},{1})", m_x.ToString(), m_y.ToString()); } } class Program { static void Main(string[] args) { Point p = new Point(1, 1); Console.WriteLine(p); p.Change(2, 2); Console.WriteLine(p); Object o = p; Console.WriteLine(o); ((Point)o).Change(3,3); Console.WriteLine(o); } }
,首先Point是值类型,其次,WriteLine方法并没有关于Point的重载方法(毕竟使我们自己写的)。因此,我们第一个WriteLine会把p进行装箱,调用WriteLine(Object)这个方法。装箱后的p找到有覆写的ToString,因此可以正常调用,这样前三次的输出应该都没有问题。最后一次输出,o是已装箱的p,我们强制转换成Point,这里会有一个拆箱的过程,系统会存一个临时的值变量Point,这个临时值变量会去调用Change方法,注意这并不会影响引用类型o的值。所以依然是2,2。
internal interface IChangeBoxedPoint { void Change(Int32 x, Int32 y); } internal struct Point : IChangeBoxedPoint { private Int32 m_x, m_y; public Point(Int32 x, Int32 y) { m_x = x; m_y = y; } public void Change(Int32 x, Int32 y) { m_x = x; m_y = y; } public override string ToString() { return String.Format("({0},{1})", m_x.ToString(), m_y.ToString()); } } class Program { static void Main(string[] args) { Point p = new Point(1, 1); Console.WriteLine(p); p.Change(2, 2); Console.WriteLine(p); Object o = p; Console.WriteLine(o); ((Point)o).Change(3,3); Console.WriteLine(o); ((IChangeBoxedPoint)p).Change(4,4); Console.WriteLine(p); ((IChangeBoxedPoint)o).Change(5,5); Console.WriteLine(o); } }
,虽然结构体继承了interface,但它的本质还是值类型,因此前面四个输出和题5一毛一样。第五个输出同第四个,值改变的是装箱后的p,因此值类型p的输出不受影响。最后一个输出,o已经是装箱后的对象,因此o是引用,改变值会生效。