这篇文章主要介绍了C#中as和is关键字的用法的相关资料,需要的朋友可以参考下。

在程序中,进行类型转换是常见的事,C#支持基本的强制类型转换方法,例如:

 Object obj1 = new NewType();
NewType newValue = (NewType)obj1;

这样强制转换的时候,这个过程是不安全的,因此需要用try-catch语句进行保护,这样一来,比较安全的代码方式应如下所示:

Object obj1 = new NewType();
NewType newValue = null;
try
{
  newValue = (NewType)obj1;
}
catch (Exception err)
{
  MessageBox.Show(err.Message);
}

但是上面的写法在C#中已是过时的写法,也是比较低效的写法,比较高效且时尚的写法是用as操作符,如下:

 Object obj1 = new NewType();
NewTYpe newValue = obj1 as NewType;

安全性:

as操作符不会做过多转换操作,当需要转化对象的类型属于转换目标类型或者转换目标类型的派生类型时,那么此转换操作才能成功,而且并不产生新的对象【当不成功的时候,会返回null】。因此用as进行类型转换是安全的。

效率:

当用as操作符进行类型转换的时候,首先判断当前对象的类型,当类型满足要求后才进行转换,而传统的类型转换方式,是用当前对象直接去转换,而且为了保护转换成功,要加上try-catch,所以,相对来说,as效率高点。
需要注意的是,不管是传统的还是as操作符进行类型转换之后,在使用之前,需要进行判断转换是否成功,如下:

 if(newValue != null)
{
//Work with the object named “newValue“
}

但是,使用as操作符要注意以下几点:

1、不用在类型之间进行类型转化,即如下编写就会出现编译错误:

 NewType newValue = new NewType();
NewTYpe1 newValue = newValue as NewTYpe1;

2、不能应用在值类型数据,即不能如下写(也会出现编译错误):

 Object obj1 = ;
int nValue = obj1 as int;

对于1.,可以用传统的类型转换方式完成:

 NewTypeOne newTestOne = new NewTypeOne();
NewTypeTwo newTestTwo = (NewTypeTwo)newTestOne;

要想使上面的操作正确完成,在原有类型中增加类型转换操作符函数,即需要完成类似如下的代码:

 public calss NewTypeOne
{
  public static explicit operator NewTypeTwo( NewTypeOne obj1)
  {
  //Convert object into new type
  }
}

对于2,在C#中可以使用is操作符,再加上老式的类型转换操作,就可以安全完成转换,要完成如上操作,正确的写法如下:

 Object obj1 = ;
if(objTest is int )
{
  int nValue = (int)obj1;
}

在C#中提供的很好的类型转换方式总结为:

Object => 已知引用类型——使用as操作符完成;

Object => 已知值类型——先使用is操作符来进行判断,再用类型强转换方式进行转换;

已知引用类型之间转换——首先需要相应类型提供转换函数,再用类型强转换方式进行转换;

已知值类型之间转换——最好使用系统提供的Conver类所涉及的静态方法。

下面给大家介绍下C#中关于as关键字的使用

我们在实际编码中有时会用到as关键字来将对象转换为指定类型,与is类型不同的是,is关键字是用于检查对象是否与给定类型兼容,如果兼容就返回true,如果不兼容就返回false。而as关键字会直接进行类型转换,如果转换成功会返回转换后的对象,如果转换不成功则不会抛出异常而是返回null。

下面我们创建一个简单的用例来阐述as的用法:

1.以visual studio2015为开发环境,新建一个window Form窗体应用程序,并将其命名为TransForm.

2.向窗体中添加一个button控件,用于类型转换,再添加一个GroupBox控件,向此控件中添加三个RadioButton控件,分别用于选择哪种类型。

3.详细代码如下:

  private void btn_Get_Checked(object sender,EventArgs e)
{
 if(rbtn_object.checked)
 {
   using (FileStream P_filestream=new FileStream(@'d:\log.txt',System.IO.FileMode.Create))
   {
     object p_Object = P_filestream as object;
     if(p_Object!=null)
     {
       Message.Box("转换Obejct成功","提示");
      }
      else
      {
       Message.Box("转换Obejct失败","提示!");
      }
    }
  }
  if(rbtn_stream.checked)
  {
    using (FileStream P_filestream=new FileStream(@'d:\log.txt',System.IO.FileMode.Create))
    {
      obejct p_object=P_filestream;
      Stream P_Stream = p_objec as Stream;
      if(P_Stream!=null)
      {
        Message.Box("转换Stream成功","提示");
      }
      else
      {
        Message.Box("转换Stream失败","提示!");
      }
    }
  }
}

[转载]C#中as和is关键字的用法的更多相关文章

  1. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

  2. [转载]jQuery中wrap、wrapAll和wrapInner用法以及区别

    原文地址:jQuery中wrap.wrapAll和wrapInner用法以及区别作者:伊少君 原文: <ul>   <li title='苹果'>苹果</li>   ...

  3. 转载 Python中关键字global与nonlocal的区别

    转载自CSDN 雁丘1990, 原文地址: https://blog.csdn.net/xcyansun/article/details/79672634 这篇文章写的很赞, 条理清晰, 分析循序渐进 ...

  4. 【转载】RobotFramework的Setup或Teardowm中执行多个关键字

    有时候需要在setup和teardowm中执行多个关键字 以前的做法就是重新封装一个keyword,然后调用,It’s OK 这里介绍另外一个方法,使用Run Keywords来实现 用法其实非常的简 ...

  5. [转载] Java中枚举类型的使用 - enum

    目录 1 枚举类的编译特性 2 向枚举类中添加方法 3 接口内部创建枚举 4 枚举类中使用枚举 5 扩展: 验证values()不是通过父类继承的 本文转载自博客 - Java枚举类型, 博主对原文内 ...

  6. Java中关键字final用法

    ///首先声明,本文转载自博客园的海子,链接:http://www.cnblogs.com/dolphin0520/p/3736238.html 浅析Java中的final关键字 谈到final关键字 ...

  7. nginx中root与alias关键字的区别

    前言 近段时间秋招上岸了,于是每天疯狂补各种分布式基础,每天都在痛苦与快乐中度过. 在学习 nginx 的时候,遇到配置上的问题:root 与 alias 的区别,卡了大概三个小时,记录下来警醒自己不 ...

  8. C++中typename关键字的用法

    我在我的 薛途的博客 上发表了新的文章,欢迎各位批评指正. C++中typename关键字的用法

  9. java中synchronized关键字的用法

    在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看这个关键字的用法. 因为synchronized关键字涉及到锁的概念,所以先来了解一些相关的锁知识. j ...

随机推荐

  1. Java中Eclipse的使用

    Eclipse是跨平台的自由集成开发环境(IDE),初衷主要为Java语言的定制.第一次使用就喜欢上了它.它可以帮我们导入包,而不需要我们导入,有很多快捷键提供我们使用,方便节省时间:最值得我喜欢的是 ...

  2. 【原创】开源.NET排列组合组件KwCombinatorics使用(二)——排列生成

           本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1. ...

  3. 借助node实战WebSocket

    一.WebSocket概述 WebSocket协议,是建立在TCP协议上的,而非HTTP协议. 如下: ws://127.0.0.1或wss://127.0.0.1就是WebSocket请求. 注:w ...

  4. 从零开始编写自己的C#框架(7)——需求分析

    本章内容虽然叫“需求分析”,实际上关于具体的需求分析操作步骤并没有深入去写,因为细化的话那将是一本厚厚的书,而需求分析在本系列中,是帮助大家了解项目的基本要求(主要针对本项目而已).而写本章的主要目的 ...

  5. 梯度下降(Gradient Descent)小结

    在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法.这里就对梯度下降法做一个完整的总结. 1. 梯度 在微 ...

  6. iOS OC语言: Block底层实现原理

    先来简单介绍一下BlockBlock是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,Block可以在任何时候执行. Block和函数的相似性:(1)可以保存代码(2) ...

  7. CodeIgniter-Lottery - php ci 抽奖辅助函数

    CodeIgniter-Lottery - php ci 抽奖辅助函数 Github https://github.com/xjnotxj/CodeIgniter-Lottery 用法 1. 移入文件 ...

  8. PostgreSql+PostGIS和uDig的安装

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 总体来说,这两款开源软件均是很好安装的,一般按照提示一步一步 ...

  9. SFC中的故障管理

    1.SFC中包的格式 网络服务包头,当Obit被设置为1时,表示一个SFC OAM消息 OAM Type:SFC OAM的类型(1.连接认证,2.持续性检验,3.路由跟踪,4.性能度量) SFC OA ...

  10. SQLite关系型数据库

    SQLiteOpenHelper的使用:       首先声明一个DatabaseHelper类,这个类继承于SQLiteOpenHelper类,首先得有构造函数,声明DatabaseHelper类如 ...