运算符和类型强制转换
运算符
条件运算符
int x = 1; int y = (x == 1 ? 2 : 3); Console.WriteLine(y); // y = 2 Console.ReadKey();
- checked和unchecked:自动检查溢出和忽略溢出
byte x = 255; checked { x++; } Console.WriteLine(x.ToString()); Console.ReadLine();
- is运算符:检查对象是否与特定的类型兼容
- as运算符:用于执行引用类型的显式类型转换。兼容:转换成功,不兼容:返回null
- sizeof运算符:可以确定栈中值类型需要的长度
- typeof运算符:返回一个表示特定类型的 System.Type 对象
类型的安全性
隐式转换:自动的进行转换【从小的到大的】
显式转换:强制的进行转换【从大的到小的】
装箱和拆箱:把值类型转换为引用类型
- 装箱
int myIntNumber = 20; object myObject = myIntNumber;
- 拆箱
int myIntNumber = 20; object myObject = myIntNumber; int mySecondNumber = (int)myObject;
- 警告:在拆箱时,确保得到的值变量有足够的空间存储拆箱的值中的所有字节。
- 例子:C#的 int 只有 32 位,所以把 long 值(64位)拆箱为 int 时,会导致一个InvalidCastException异常
比较对象的相等性
比较引用类型的相等性
ReferenceEauals()方法
- ReferenceEauals()方法是一个静态方法。测试两个引用是否引用类的同一个实例,特别是两个引用是否包含内存中的相同地址
Product pro1 = new Product(); Product pro2 = new Product(); bool B1 = ReferenceEquals(null, null); // true bool B2 = ReferenceEquals(null, pro1); // false bool B3 = ReferenceEquals(pro2, pro1); // false
Equals()方法
- 在自己的类重写它,从而按值来比较对象
比较运算符( == )
- 如果类可以看做值,那就是值比较。反之,则是引用比较。
类之间的强制转换
类之间的类型强制转换
- 如果某个类派生自另一个类,就不能定义这两个类之间的类型强制转换
- 类型强制转换必须在元数据类型或目标数据类型的内部定义
基类和派生类之间的类型强制转换
- 父类可以实例化子类,子类没办法实例化父类
class Program { static void Main() { Student st = new XiaoMing(); // 正确 运行的方法为Stduent的方法 st.eat(); XiaoMing xi = new Student(); // 错误 } } class Student { public void eat() { Console.WriteLine("我会吃"); } public void play() { Console.WriteLine("我会玩"); } } class XiaoMing : Student { public void Name() { Console.WriteLine("我叫小明"); } }