• C#基础知识---is与as


    一、is与as对比

    is检查一个对象是否兼容于指定的类型,并返回一个Boolean值:true或者fasle。

    注:is操作符永远不会抛出异常

    经常按如下方法使用:

    ClassA

    {

    ....

    }

    Object o=new Object();

    Boolean b1=(o is Object); //b1为true.

    Boolean b2=(o is ClassA) ; b2为false.

    如果对象引用是null,is操作符总是返回false,因为没有可检查的其类型的对象。

    if(obj is ClassA)

    {

        ClassA a=(ClassA) obj;

       ...

     }

     在这段代码中,CLR实际会检查两次对象类型。is操作符首先核实obj是否兼容于ClassA 类型,如果是,那么在if语句内部执行类型转换时,CLR再次核实obj是否引用一个ClassA。CLR的类型检查增强了安全性,但也会对性能造成一定的影响

    as与is做差不多的事情,类型显式强制转换。 as操作符的工作方式与强制类型转换一样,如果对象不能转换,结果就是null

    as常用法如下:

    Object obj=new Object();

    ClassA a= obj  as ClassA;

     if(a != null)  //在if判断a是否为null

    {

    ...

    }

    在这段代码中,CLR核实obj是否兼容于ClassA类型,如果是,as会返回对同一个对象的一个非null引用;

    如果obj不兼容ClassA类型,as操作符会返回null

    因此,as操作符使CLR只检验一次对象的类型

    当as操作符返回null的时候,如果不进行判断直接调用,则会抛出NullReferenceException异常。

     示例代码:

    Object obj=new Object(); //创建一个object对象.

    ClassA a =obj as ClassA;//将obj转型为ClassA,此时转型操作会失败,不会抛出异常,但a会被设为null.

    a.ToString();//访问a会抛出一个NullReferenceException异常。

    二、例子

     1 public class Calculator
     2     {
     3         public int Add(int a, int b)
     4         {
     5 
     6             int result = a + b;
     7             Console.WriteLine("Base: " + result);
     8             return result;
     9 
    10         }
    11     }
    12     public class CalculatorSub : Calculator
    13     {
    14         public new int Add(int a, int b)
    15         {
    16             int result = 2 * a + b;
    17             Console.WriteLine("Sub: " + result);
    18             return result;
    19 
    20         }
    21     }
    22     class Program
    23     {
    24         static void Main(string[] args)
    25         {
    26 
    27             Object obj1 = new Object();
    28             CalculatorSub calSub = new CalculatorSub();
    29 
    30             Calculator calBase = new Calculator();
    31 
    32             bool a = calBase is CalculatorSub;
    33             if(a)
    34             {
    35                 ( (CalculatorSub)calBase ).Add(2, 3);
    36             }
    37             var b = calBase as CalculatorSub;
    38             if(b != null)
    39             {
    40                 b.Add(2, 3);
    41             }
    42             bool c = calSub is Calculator;
    43             if (c)
    44             {
    45                 ((Calculator)calSub).Add(2, 3);
    46             }
    47             var d = calSub as Calculator;
    48             if(d != null)
    49             {
    50                 d.Add(2, 3);
    51             }
    52             (calSub as Calculator)?.Add(2, 3);//如果calSub as Calculator为null,则不会调用Add方法
    53 
    54             Console.ReadKey();
    55         }
    56 
    57     }
    View Code
  • 相关阅读:
    android 图片特效处理之模糊效果
    android 图片特效处理之怀旧效果
    android图像处理系列之六-- 给图片添加边框(下)-图片叠加
    android图像处理系列之五-- 给图片添加边框(中)
    android图像处理系列之四-- 给图片添加边框(上)
    android图像处理系列之三-- 图片色调饱和度、色相、亮度处理
    Android学习笔记进阶18 之画图并保存图片到本地
    Android学习笔记进阶19 之给图片加边框
    HDU3572_Task Schedule(网络流最大流)
    再淡spring jdbc 连接池断开重连设置
  • 原文地址:https://www.cnblogs.com/3xiaolonglong/p/9675367.html
Copyright © 2020-2023  润新知