C#中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#程序设计有所帮助。

(0)

相关推荐

  • C#抽象类和接口的区别分析

    很多C#的初学者在编程时都容易把抽象类和接口搞混,本文就为大家从概念上讲解抽象类和接口的区别: 一.抽象类: 含有abstract修饰符的class即为抽象类,抽象类是特殊的类,只是不能被实例化,可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例:除此以外,具有类的其他特性:重要的是抽象类可以包括抽象方法,这是普通类所不能的.抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们.另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖. 二.接口: 接口是

  • c# 命名空间和程序集

    使用类的全权名: System.Text.StringBuilder sb = new System.Text.StringBuilder(); 上面的写法很繁琐,使用using语句引入命名空间: using System.Text; StringBuilder sb = new StringBuilder(); 对于编译器来说,命名空间就是为一个类型附加一些分隔符号,使名称更有唯一性. c#的using指令是可选的,完全可以用类型的完整名称代替,c# 的using指令时指示编译器为 每一个类型

  • C#中值类型和引用类型的区别深度分析

    本文通俗易懂的分析了C#中值类型和引用类型的区别.分享给大家供大家参考.具体分析如下: 似乎"值类型和引用类型的区别"是今年面试的流行趋势,我已然是连续三次(目前总共也就三次)面试第一个问题就遇到这个了,这是多大的概率啊,100%,哈哈,我该买彩票去! 言归正传,咱还是先来探讨探讨这二者之间有什么区别吧.记得有一次电话面试中,我直接跟面试官说:"值类型是现金,引用类型是存折",后来想想当时说这话虽是有点儿冲动地脱口而出,但也没什么不妥.我这人不善于背理论的教条,喜欢

  • C#中ref和out的区别浅析

    在C#中通过使用方法来获取返回值时,通常只能得到一个返回值.因此,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢? MSDN:        ref 关键字使参数按引用传递.其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中.若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字.       out 关键字会导致参数通过引用来传递.这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行

  • C#中sleep和wait的区别分析

    本文较为详细的分析了C#中sleep和wait的区别.分享给大家供大家参考.具体分析如下: sleep和wait都是使线程暂时停止执行的方法,但它们有很大的不同. ①. sleep是线程类Thread 的方法,它是使当前线程暂时睡眠,可以放在任何位置. 而wait是Object类的方法,它是使当前线程暂时放弃对象的使用权进行等待,必须放在同步方法或同步块里. ②. Sleep使用的时候,线程并不会放弃对象的使用权,即不会释放对象锁,所以在同步方法或同步块中使用sleep,一个线程访问时,其他的线

  • C#中的is和as操作符区别小结

    1. is 是验证操作对象是不是自己希望的 运算公式:对象  is  类型 返回true:对象是指定类型 返回false:对象不是指定类型 2. as 是将对象转换成指定类型 运算公式:对象 as 类型 转换成功:对象的类型就是指定的类型 转换失败:返回null 注意: The  "is" and "as" operator must be used with a reference type or nullable type (example:'int' is a

  • C#和Java中二维数组区别分析

    本文实例讲述了C#和Java中二维数组区别,分享给大家供大家参考.具体分析如下: 在Java中使用二维数组可以如下代码: 复制代码 代码如下: public class Array2D{     public static void main(String[] args){         int myInt[][]=new int[5][10];         //遍历,给数组中的每一个数组赋值         for(int i=0;i<myInt.length;i++){        

  • C#命名空间与java包的区别分析

    本文实例分析了C#命名空间与java包的区别.分享给大家供大家参考.具体分析如下: 相同点: 1.都是为了重用性(reusebility)--软件工程中一个非常重要的目标. 2.C#里面的命名空间和java中的包都属于访问权限的控制机制. 不同点: 1.C#命名空间只是一种逻辑上的结构,它允许所组织的类文件的物理存放位置与逻辑结构不一致,而Java中类文件的物理结构必须与逻辑结构一致. 2.Java的package本身没有子包的概念,所有package都是并列的关系,没有谁包含谁的问题.比如:o

  • jQuery中.attr()和.data()的区别分析

    $.attr()和$.data()本质上属于 DOM属性 和 Jquery对象属性 的区别. Jquery对象属性和DOM属性 一个简单的例子 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Jquery中.attr和.data的区别</title> </head> <body> <p id="app&q

  • C#中Write()和WriteLine()的区别分析

    Write()和WriteLine()都是System.Console提供的方法,两着主要用来将输出流由指定的输出装置(默认为屏幕)显示出来. 两着间的差异在 Console.WriteLine()方法是将要输出的字符串与换行控制字符一起输出,当次语句执行完毕时,光标会移到目前输出字符串的下一行. 至于Console.Write()方法,光标会停在输出字符串的最后一个字符后,不会移动到下一行. Write()和WriteLine()区别 都是System.Console提供的方法 都是在屏幕显示

  • Jquery中offset()和position()的区别分析

    本文实例分析了Jquery中offset()和position()的区别.分享给大家供大家参考.具体分析如下: 一.Jquery中offset() 获取匹配元素在当前视口的相对偏移. 总是计算相对于文档的位置,无论元素的父元素或祖先元素的position属性是什么. 返回的对象包含两个整形属性:top 和 left.此方法只对可见元素有效.   例如: <!DOCTYPE html> <html> <head> <style> p { margin-left

  • asp.net中virtual和abstract的区别分析

    本文实例分析了asp.net中virtual和abstract的区别,分享给大家供大家参考.具体分析如下: 一.Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况: 情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法.那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法. 情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法.那么在对派生类实例的调用中,该虚方法使用的是派生重写的方

  • php进行支付宝开发中return_url和notify_url的区别分析

    本文实例分析了php进行支付宝开发中return_url和notify_url的区别.分享给大家供大家参考.具体分析如下: 在支付宝处理业务中return_url,notify_url是返回些什么状态呢,我们要根据它来做一些处理就必须了解return_url,notify_url的区别,下面我就来给大家介绍介绍. 问题描述: 我在处理支付宝业务中出现过这样的问题,付费完成后,在支付宝跳转到商家指定页面时,订单状态已经更新,通过调试发现是支付宝先通知notify_url,完成了订单状态. 支付宝r

  • PHP中addslashes与mysql_escape_string的区别分析

    本文实例分析了PHP中addslashes与mysql_escape_string的区别.分享给大家供大家参考,具体如下: 1.在插入数据时两者的意义基本一样.区别只在于addslashes 在magic_quotes_sybase=on时将" '"转换成" ' '" 在magic_quotes_sybase=off时将" '"转换成"\ '" 而mysql_escape_string总是将" '"转换成&

  • Android Activity中onStart()和onResume()的区别分析

    本文分析了Android Activity中onStart()和onResume()的区别.分享给大家供大家参考,具体如下: 首先你要知道Activity的四种状态: ① Active/Runing 一个新 Activity 启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态. ② Paused 当 Activity 被另一个透明或者 Dialog 样式的 Activity 覆盖时的状态.此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它

  • C#中is与as的区别分析

    本文实例分析了C#中is与as的区别,分享给大家供大家参考.具体分析如下: 一.C#类型的转换 在c#中类型的转换分两种:显式和隐式,基本的规则如下: 1.基类对象转化为子类对象,必须显式转换,规则:(类型名) 对象. 2.值类型和引用类型的转换采用装箱(boxing)或拆箱(unboxing). 3.子类转化为基类对象. 4.基本类型互相之间转化可以用Covent类来实现. 5.字符串类型转换为对应的基本类型用Parse方法,除了String类型外其他的类型都可以用Parse方法. 6.用Ge

  • Android编程中@id和@+id的区别分析

    本文分析了Android编程中@id和@+id的区别.分享给大家供大家参考,具体如下: Android中的组件需要用一个int类型的值来表示,这个值就是组件标签中的id属性值. id属性只能接受资源类型的值,也就是必须以@开头的值,例如,@id/abc.@+id/xyz等. 如果在@后面使用"+",表示当修改完某个布局文件并保存后,系统会自动在R.java文件中生成相应的int类型变量.变量名就是"/"后面的值,例如,@+id/xyz会在R.java文件中生成int

  • jQuery中parents()和parent()的区别分析

    本文实例分析了jQuery中parents()和parent()的区别,分享给大家供大家参考.具体分析如下: 其实在jQuery中,函数或者选择器的概念都是很容易理解的,只要对API手册有足够的熟练就能够很容易分辨,标题中的函数其实也是如此,不过咱们这里还是做一些简单的介绍,毕竟这样可能更为方便一些. 一.parents()函数: 此函数能够获取匹配元素的所有父元素,代码示例: 复制代码 代码如下: $(".mayi").parents().css("color",

随机推荐