C#中 As 和强制转换的总结
解析C#中的is和as操作符的用法

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#中子类与父类的相互转换

子类和父类的关系

  1. 子类不能继承父类的私有字段. 可以继承属性与方法.
  2. 子类会默认调用父类的无参构造函数. 如果父类中有一个有惨的构造函数. 无参构造函数会被覆盖?. 子类调用报错. 解决方法: 使用base()关键字.
  3. 若子类和父类方法名相同. 子类会覆盖父类的.
  4. 一个类继承其他类. 那么默认继承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;

所有的子类也都是父类的,可以申明一个父类的变量,来接受其所有的子类;
父类若存的是子类的对象,可以将父类转成相应的子类对象

作用:把不同子类的对象统一转换为父类(基类)的类型,使数据类型达到统一。在父类对象所在的位置都可以传进来子类的对象,尽可能重用代码。

这不是就是多态…

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐