using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace is和as
{
/*
* is的作用:用于判断类型是否匹配,匹配返回ture,不匹配返回false;is操作符永远不会抛出异常。
* 例:obj is TypeA;
* 该行代码可确定obj是否为TypeA 或者 TypeA派生类的一个实例。
*
* as的作用:用于在匹配的引用类型之间进行类型转换
* */
class Program
{
static void Main(string[] args)
{
#region is的用法
ParentClass parentClass = new ParentClass();
if (parentClass is ParentClass)
Console.WriteLine("对象parentClass与ParentClass类型匹配");
else
Console.WriteLine("对象parentClass与ParentClass类型不匹配");
ChildClass childClass = new ChildClass();
if (childClass is ParentClass)
{
Console.WriteLine("对象childClass与ParentClass类型匹配");
ParentClass p = (ParentClass)childClass;
/*
* 注:
* 在这个if代码块内,CLR会进行两次对象类型的检查,
* 第一次是在is判断的时候,CLR会检查类型是否匹配;
* 第二次是在强制转换的时候,CLR会再次检查类型是否匹配。
* CLR的类型检查增强了安全性,但是对性能造成了影响。
* 为此,C#提供了as运算符,简化写法,提升性能。
* */
}
else
{
Console.WriteLine("对象childClass与ParentClass类型不匹配");
}
#endregion
#region as的用法
ParentClass pp = childClass as ParentClass;//CLR检查类型是否匹配,匹配则返回同一对象的引用,不匹配返回null。
if (null != pp)
Console.WriteLine("转换成功");
else
Console.WriteLine("转换失败");
/*
* 注:
* 1.as运算符造成CLR只进行一次类型检查,所以可以提升性能。
* 2.as运算符的工作方式与强制类型转换一样,但as不会抛出异常,因为转换失败时返回null而非抛出异常。
* */
#endregion
Console.ReadLine();
}
}
/// <summary>
/// 父类
/// </summary>
class ParentClass
{
public string name = "www";
public int age = 0;
}
/// <summary>
/// 子类
/// </summary>
class ChildClass : ParentClass
{
public string tel = "911";
public string qq = "000";
}
}
参考资料: https://www.cnblogs.com/cgli/archive/2011/05/10/2041731.html