为了账号安全,请及时绑定邮箱和手机立即绑定

这个地方为什么值类型被封装了?请教大家

这个地方为什么值类型被封装了?请教大家

慕慕森 2018-12-07 09:19:17
 《CLR via C#(第三版)》中第124页。    using System; internal struct Point{ private Int32 m_x,m_y;   public Point(Int32 x,Int32 y){ m_x=x;m_y=y; }   public void ChangePoint(Int32 x,Int32 y) { m_x=x;m_y=y; }   public override String ToString() { return String.Format("({0},{1})“,m_x,m_y); }   } public sealed class Program { public static void Main(){ 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); } } A、作者说在第一次调用WriteLine之前,p要进行封装,WriteLine会在已装箱的Point上调用ToString,并与其的那样显示(1,1)。【我就没弄懂为什么是在在WriteLine之前就封装了,不是在WriteLine的时候封装吗???】      我理解的是在WriteLine方法的时候进行了封装。 但是他的意思是在之前就封装了再WriteLine里面调用了ToString方法,这儿没有搞懂。。。 B、然后p调用Change方法,把m_xhe m_y都修改为2,第二次调用WriteLine时,要求再次对p进行封装,并预期的那样显示(2,2) 这个我可以理解的。
查看完整描述

3 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

因为此时WriteLine使用的是 object 参数,那么在调用 WriteLine 之前,需要先把Point转换为Object类型。WriteLine只负责接收Object类型的参数,这个Object类型的参数是怎么得来的是不由WriteLine来管的。

查看完整回答
反对 回复 2019-01-21
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

“WriteLine会在已装箱的Point上调用ToString”

这句话没问题,装好箱,WriteLine才能调用ToString。

这名话并没有说在WriteLine语句执行之前进行装箱。

这里有一篇不错的图文并茂的装箱方面的文章:

The C# Value Type and Boxing

查看完整回答
反对 回复 2019-01-21
  • 3 回答
  • 0 关注
  • 275 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信