C#中is与as的区别分析

 更新时间:2014年10月24日 10:44:56   投稿:shichen2014  
这篇文章主要介绍了C#中is与as的区别,较为详细的分析了is与as的原理与特性及用法区别,具有很好的学习借鉴价值,需要的朋友可以参考下

本文实例分析了C#中is与as的区别,分享给大家供大家参考。具体分析如下:

一、C#类型的转换

在c#中类型的转换分两种:显式和隐式,基本的规则如下:

1、基类对象转化为子类对象,必须显式转换,规则:(类型名) 对象。
2、值类型和引用类型的转换采用装箱(boxing)或拆箱(unboxing).
3、子类转化为基类对象。
4、基本类型互相之间转化可以用Covent类来实现。
5、字符串类型转换为对应的基本类型用Parse方法,除了String类型外其他的类型都可以用Parse方法。
6、用GetType可以取得对象的精确类型。
7、子类转化为基类,采用隐式转换。

二、C#中的is

检查一个对象是否兼容于其他指定的类型,并返回一个Bool值,如果一个对象是某个类型或是其父类型的话就返回为true,否则的话就会返回为false。永远不会抛出异常
如果对象引用为null,那么is操作符总是返回为false,因为没有对象可以检查其类型。

例如

复制代码 代码如下:
object o = new object();
if (o is Label)
{
    Label lb = (Label)o;
    Response.Write("类型转换成功");
}
else
{
    Response.Write("类型转换失败");  
}

三、C#中as的转换规则

1、检查对象类型的兼容性,并返回转换结果,如果不兼容则返回null;
2、不会抛出异常;
3、如果结果判断为空,则强制执行类型转换将抛出NullReferenceException异常;
4、用as来进行类型转换的时候,所要转换的对象类型必须是目标类型或者转换目标类型的派生类型

例如

复制代码 代码如下:
object o = new object();   
Label lb = o as Label;   
if (lb == null)
{
    Response.Write("类型转换失败");
}
else
{     
    Response.Write("类型转换成功");
}

使用as操作符有如下几点限制

第一个就是,不用在类型之间进行类型转化,即如下编写就会出现编译错误。

复制代码 代码如下:
NewType newValue = new NewType();
NewType1 newValue = newValue as NewType1;

第二个就是,不能应用在值类型数据,即不能如下写(也会出现编译错误)。

复制代码 代码如下:
object objTest = 11;
int nValue = objTest as int;

四、as与is的区别

1、AS在转换的同事兼判断兼容性,如果无法进行转换,则 as 返回 null(没有产生新的对象)而不是引发异常。有了AS我想以后就不要再用try-catch来做类型转换的判断了。因此as转换成功要判断是否为null。

2、AS是引用类型类型的转换或者装箱转换,不能用与值类型的转换。如果是值类型只能结合is来强制转换
3、IS只是做类型兼容判断,并不执行真正的类型转换。返回true或false,不会返回null,对象为null也会返回false。

4、AS模式的效率要比IS模式的高,因为借助IS进行类型转换的化,需要执行两次类型兼容检查。而AS只需要做一次类型兼容,一次null检查,null检查要比类型兼容检查快。

五、在进行类型转换的时候,可以按照如下的方式进行选择

1、Object => 已知引用类型
使用as操作符来完成

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

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

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

六、(int)和Int32.Parse(),Convert.ToInt32()三者的区别

1、(int)转换:用在数值范围大的类型转换成数值范围小的类型时使用,但是如果被转换的数值大于或者小于数值范围,则得到一个错误的结果,利用这种转换方式不能将string转换成int,会报错。

2、Int32.Parse()转换:在符合数字格式的string到int类型转换过程中使用,并可以对错误的string数字格式的抛出相应的异常。

3、Convert.ToInt32()转换:使用这种转换,所提供的字符串必须是数值的有效表达方式,该数还必须不是溢出的数。否则抛出异常。

希望本文所述对大家的C#程序设计有所帮助。

相关文章

  • C#访问PostGreSQL数据库的方法

    C#访问PostGreSQL数据库的方法

    这次的项目中的一个环节要求我把PostGreSQL数据取出来,然后放到SqlServer里,再去处理分析。
    2013-04-04
  • c#在控制台输出彩色文字的方法

    c#在控制台输出彩色文字的方法

    c#在控制台输出彩色文字的方法,需要的朋友可以参考一下
    2013-03-03
  • C# goto语句的具体使用

    C# goto语句的具体使用

    # goto 语句用于直接在一个程序中转到程序中的标签指定的位置,标签实际上由标识符加上冒号构成。本文主要介绍了C# goto语句的具体使用,感兴趣的可以了解一下
    2021-06-06
  • C sharp (#) 数据类型获取方式

    C sharp (#) 数据类型获取方式

    这篇文章主要介绍了C sharp (#) 数据类型获取方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 轻松学习C#的基础入门

    轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下
    2015-11-11
  • C#实现两个richtextbox控件滚动条同步滚动的简单方法

    C#实现两个richtextbox控件滚动条同步滚动的简单方法

    这篇文章主要给大家介绍了C#实现两个richtextbox控件滚动条同步滚动的简单方法,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-05-05
  • C#实现改变DataGrid某一行和单元格颜色的方法

    C#实现改变DataGrid某一行和单元格颜色的方法

    这篇文章主要介绍了C#实现改变DataGrid某一行和单元格颜色的方法,主要涉及DataGrid控件的添加与使用、数据源的绑定、单元格与行的获取等操作。需要的朋友可以参考下
    2014-09-09
  • C#多线程用法详解

    C#多线程用法详解

    本文详细讲解了C#多线程用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • c#使用EPPlus封装excel表格导入功能的问题

    c#使用EPPlus封装excel表格导入功能的问题

    这篇文章主要介绍了c#使用EPPlus封装excel表格导入功能的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 使用C#实现简单的线性回归的代码详解

    使用C#实现简单的线性回归的代码详解

    最近注意到了NumSharp,想学习一下,最好的学习方式就是去实践,因此从github上找了一个用python实现的简单线性回归代码,然后基于NumSharp用C#进行了改写,需要的朋友可以参考下
    2024-01-01

最新评论