第五章 运算符和类型强制转换

1、byte b=255 b++后b=0 溢出位被丢弃

2、unchecked是默认值 ,只有在需要把几个未检查的值放在checked中,才需要显式指定unchecked int i=checked((int)7.80F);
   也可以checked{}

3、sizeof(算字节长度)、->、&、*都必须在unsafe代码中运行,font是一个整体,一般不允许直接改其个别属性

4、值类型转换,只能在数字,char、enum类型之间转换,不能把Boolean类型转换为其他类型,也不能把其他类型转换为Boolean

5、装箱把一个值类型转换为引用类型,运行库会在堆上为之建立一个引用

6、ReferenceEquals()方法是静态的(所有静态的方法都不能重写?),不能重写,只能由Object实现,它认为null相等。用于值类型都false

7、Equals是virtual ,可以重写,如果希望类实例用作字典中的键,就必须重写该方法(为什么?)重写该方法也相当于重写了静态的Equals

8、Microsoft已经重写了System.ValueType的Equals方法,使得它比较值,结构不支持用==比较,除非自己重载运算符

9、double x=8990F;double y=x+5;会把5转换为double型

10、所有运算符重载或者强制类型转换都必须声明为public static 表示它们跟类或结构相关。

11、public static Vector operator *(double d,Vector v)
    {
         return new Vector(d*v.x,d*v.y);
    }
    //如果在这里调用 Vector v=(new Vector(1,2))*70F就会由于顺序相反报错。
    public static Vector operator *(Vector v,double d)
    {
         return d*v;
    }

12、c#不允许重载=运算符

13、重载比较运算符必须成对重载,比较运算符返回的都是bool,而且如果重载的是==和!=就必须重载Equals,因为2个必须一样的逻辑,重载

比较运算符的方法的用==比用Equals安全,因为调用方法必须非null引用。(>和<、>=和<=)

14、强制类型转换,如果转换都是安全的,可以定位为隐式转换(public static implicit operator BClass (AClass a)),如果不安全的,需

要定位为显式转换(public static explicit operator BClass (AClass a))

15、c#要求数据类型转换必须定义在源类(结构)或目标类(结构)之间,而且只能在一边定义,否则编译器会混淆,而且这样可以防止第三

方类把数据类型转换引入自己中

16、多重数据类型转换后面的待看