该表格的操作符优先级从上到下递减。这些操作符混合在一起组成表达式时,越靠上的操作符越先运算。
正常的运算逻辑是从左往右进行,但是最后一行的运算逻辑是从右往左。
image.png

类型转换

image.png
image.png结果为0。这里将32位的数据塞到16位的空间里,这里只能将低的16位塞进去,高的十六位舍弃掉了。正好高的十六位里有数据,而地位只有0,所以结果变为了0。
image.pngexplicit operator 俩关键字,在任意类里声明一个别的类的构造函数。

装箱和拆箱

装箱:将一个值类型的实例从栈搬到堆里去。值类型转成引用类型。
拆箱:引用类型转值类型。
这种转换涉及到存储上的变化,由堆到栈,和栈到堆都是需要消耗资源的。

  1. int i = 5;
  2. object obj = i; //装箱操作,要尽量避免装箱
  3. d=(double)obj; //拆箱操作,影响性能,也要尽量避免拆箱操作
  4. //隐式转换:不需要声明就能转换的转换(通俗来说,)
  5. int i=55;
  6. double d=i;
  7. //显式转换:又称“强制转换”(大类型转小类型,会有精度上的损失)
  8. double d2=13.14;
  9. int i2=(int)d2; //这里i2 的值为13
  10. int y=Convert.ToInt32(x);
  11. 装箱:值类型转换为引用类型(隐式转换)
  12. 拆箱:引用类型转换为值类型(显式转换)

为什么需要装箱和拆箱呢?

学习装箱,是为了尽量避免装箱,装箱往往是被迫的(例如上面的 int 转Object)。
在C#没有支持泛型之前,为了使某些程序具有通用性,使用到了Object(Object是所有类型的跟父类),所以必须装箱。
对于已装箱的对象,因为无法直接调用其指定方法,所以必须先拆箱,再调用方法,但再次拆箱,会生成新的栈实例,而无法修改装箱对象。这样消耗资源很大!