C# 是一门强类型语言. 一般情况下. 我们最好避免一个类型强制转成其他类型. 但是有时候难免使用类型转换.
一般有以下几种类型转换的方法供选择:
- 使用
as
操作符; - 使用传统 C类型风格的强制转换;
- 使用
is
来做一个类型转换测试. 然后再用as
或者 强制类型转换;
as
类型转换失败时值为null不抛出异常
但强制转换如果转换失败会抛出异常所以我们要添加异常处理
is
: 检查一个对象是否兼容于其他指定的类型,并返回一个Bool值,永远不会抛出异常
示例1
object o = new object();
if (o is Label)
{
Label lb = (Label)o; // 这里是C风格的强制类型转换
Response.Write("类型转换成功");
}
else
{
Response.Write("类型转换失败");
}
在上面的代码,CLR实际上会 检查两次对象的类型 ,is操作符先核实一次,
如果o兼容于Lable,那么在(Label)o时会再次核实一次,效率比较低,不建议使用
as:与强制类型转换是一样的,但是永远不会抛出异常,即如果转换不成功,会返回null
示例2
object o = new object();
Label lb = o as Label; // as 操作符
if (lb == null)
{
Response.Write("类型转换失败");
}
else
{
Response.Write("类型转换成功");
}
在上面的代码中,CLR只会进行一次类型核实,效率要高于 is
注意事项:
as
只能用于引用类型不能用于值类型;
C#中子类与父类的相互转换
子类和父类的关系
- 子类不能继承父类的私有字段. 可以继承属性与方法.
- 子类会默认调用父类的无参构造函数. 如果父类中有一个有惨的构造函数. 无参构造函数会被覆盖?. 子类调用报错. 解决方法: 使用base()关键字.
- 若子类和父类方法名相同. 子类会覆盖父类的.
- 一个类继承其他类. 那么默认继承Object. 即. 万物基于Object.
里式转换
里氏转换原则:面向对象设计的基本原则,基类出现的地方,子类一定可以出现。
只有子类替换掉父类,软件的功能不受影响时,父类可以真正的被复用。子类可以在父类的基础上增加新的行为。
第一种方法:
Student stu=New student;//创建一个子类对象
Person P=stu;//将子类对象赋给父类对象
P.Show();//调用父类的方法
第二种方法:
Person p =New Student(); //父类对象接受子类的实例对象
Student stu=(student)p; //强制转换成子类
第三种方法:使用关键字(is/as)
is用法:(p is teacher)p是父类的实例化对象,Teacher是带转换的类型,表达式返回的是布尔值。
Person p=New Student();
If(p is Student)
{
console.Writeline("转换成功")
}
else
{
console.Writeline("转换失败")
}
as用法:(p as teacher)as先做判断,再转换。返回值为NUll值。\
Person p=New Student();
Student t=p as Student;
所有的子类也都是父类的,可以申明一个父类的变量,来接受其所有的子类;
父类若存的是子类的对象,可以将父类转成相应的子类对象
作用:把不同子类的对象统一转换为父类(基类)的类型,使数据类型达到统一。在父类对象所在的位置都可以传进来子类的对象,尽可能重用代码。
这不是就是多态…