艰难的道路

  不为自己被淘汰找借口,因为自己还不够努力,因为自己很自大,因为自己的心浮气躁,因为自己的无知天真,职场不同于大学,这是一个真正的战场,你不去奋斗,到头来苦的还是自己,就拿C#中的很多语法糖而言,自己能够不看代码,不看书本,不看笔记,凭借自己的印象说出来的也就那么几个,今天早上起床后吃了早饭,就开始学习anytao的<<你必须知道的.NET第二版>>,中间也遇到了不少的问题,苦于自己不会使用搜索引擎,很多东西都不知道怎么去查询关键字,只好在作者的博客发问了。

  这个点正在回顾装箱和拆箱的知识,在学校的时候这个知识点几乎没有理解,只知道在Console中写一个小Demo,然后也就骄傲的说我明白装箱和拆箱了,但是直到今天,我也只晓得一些最基础的概念,装箱是值类型转换为引用类型,拆箱是引用类型转换为值类型,伴随着装箱和拆箱付出的是性能的代价。
  就拿anytao引言中的小例子来说下自己对这块的理解,如果说的不正确的麻烦各位使劲的拍砖。

  public static void Main()

{

  int i=100;

  object o=i;

     o=200;

  Hashtable ht=new Hashtable();

  ht.Add("I",i);

      ht["I"]=o;

      Console.WriteLine(i + " is original, " + (int)ht["I"] + " is changing. ");

}

发生了几次装箱,几次拆箱?

首先object o = i;这个是值类型转换成引用类型,属于装箱操作。 o = 200,同样的也是值类型转换成引用类型,属于装箱操作。 ht.Add("I",i);这个应该也是装箱操作。

(int)ht["I"],这个是引用类型转换成值类型的,属于拆箱操作的。

第二个小例子是

public static void Main()

{

  float = 1.01F;

  object o = f;

  double d=(double)o;  //Convert.ToDouble(o)可是实现将object类型转换成值类型的

}

这段代码编译的时候没有任何问题,运行时会报未处理的InvalidCastException 指定的转换无效。

因为只有被装过箱的对象才能被拆箱,而并非所有的引用类型。将并非装箱而来的引用类型强制转换成值类型,将会抛出InvalidCastException异常。

说到着,才发现自己之前理解的装箱和拆箱概念上还是有很大的出入的,anytao讲解的很形象,很有价值,可能平时工作的时候很少关注这些,感觉自己把功能实现了就OK了,但是本质上还有很多很多的东西值得你去关注,今天天气很好,写一份看书笔记,希望这是一个好的开始。

最后摘抄一下anytao书中的一段装箱就是值类型数据转换成无类型的引用对象,使得我们可以将值类型视为对象来处理,通常这种转换主要是指转换为System.Object类型或者该值类型实现的任何接口引用类型;而拆箱就是引用类型转换成值类型,通常伴随着从堆中复制对象实例的操作。

原文地址:https://www.cnblogs.com/purplecows/p/3438743.html