C#中as用法?

作者&投稿:符爽 (若有异议请与网页底部的电邮联系)
C#中as关键字的作用?~

  定义:可以使用 as 运算符执行转换的某些类型在兼容之间的引用类型或可以为 null 的类型。

  备注:as 运算符类似于强制转换操作。 但是,如果转换是不可能的,as 返回 null 而不引发异常。请注意 as 运算符执行只引用转换、nullable 转换和装箱转换。 as 运算符不能执行其他转换,如用户定义的转换,应是通过使用转换的表达式。

  expression as type

  expression is type ? (type)expression : (type)null

  这两个表达式是等效的,但 expression 变量只计算一次。

  示例:
  Object myObject = new Object(); //创建一个object对象

  ClassA a = myObject as ClassA; //将它转换为ClassA类型,此操作会失败,但不会抛异常,a会被设置为null

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

  as 的工作方式和强制类转换一样,但是它永远不会抛出一个异常,如果指定的操作不能正确地进行转换,那么得到的就是null,实际应用中通常会判断结果是否为 null;

一、当 Session["a"] == null 时,
Session["a"].ToString() 抛出异常;
(string)Session["a"] 为 null;
Convert.ToString(Session["a"]) 为 ""。
二、当 Session["a"] == "" 时,
它们的值都为 ""。
所以,在判断 Session["a"] 是否有值时,如果用“.ToString()”,那么必需按照下面的格式与顺序写:
if (Session["a"] != null && Session["a"].ToString() != "")
在这里,要注意判断的顺序:先判断是否为 null,再判断是否为 empty。如果 Session["a"] 为 null,则 Session["a"] != null 为 false 自然不会执行 .ToString(),也就不会报错;如果 Session["a"] 不为 null,则执行 .ToString() 也不会报错。
同理 if (Session["a"] == null || Session["a"].ToString() == "") 此句也合法可用。
用 .ToString() 的方法写格式比较固定,如果换成用 (string) 写,会比较自由:
if ((string)Session["a"] != null && (string)Session["a"] != "")
if (Session["a"] != null && (string)Session["a"] != "")

Is:检查对象是否与给定的类型兼容。例如,下面的代码可以确定MyObject类型的一个实例,或者对象是否从MyObject派生的一个类型:

if(obj is MyObject){}

如果所提供的表达式非空,并且所提供的对象可以强制转换为所提供的类型而不会导致引发异常,则 is 表达式的计算结果将是 true。

如果已知表达式始终是true或始终是false,则is关键字将导致编译时警告,但是通常在运行时才计算类型兼容性。

注意:is运行符不能重载,is运行符只考虑引用转换、装箱转换和取消装箱转换。不考虑其它转换,如果用户定义转换。在Is运算符的左侧不允许使用匿名方法。lambda表达式属于例外。

Object myObject = new Object();
Boolean b1 = (myObject is Object); true.
Boolean b2 = (myObject is Employee); false.
如果对象引用是null,is运算符总是返回false,因为没有可检查其类型的对象。

is运算符通常像下面这样使用:

if (myObject is Employee)

{

Employee myEmployee = (Employee)myObject;

}

在这段代码中,CLR实际会检查两次对象的类型。is运算符首先核实myObject是否兼容于Employee类型。如果是,那么在if语句内部执行转换型,CLR会再次核实myObject是否引用一个Employee。CLR的类型检查增加了安全性,但这样对性能造成一定影响。这是因为CLR首先必须判断变量(myObject)引用的对象的实际类型。然后,CLR必须遍历继承层次结构,用每个基类型去核对指定的类型(Employee)。由于这是一个相当常用的编程模式,所以C#专门提供了as运算符,目的就是简化这种代码写法,同时提升性能。

as:用于检查在兼容的引用类型之间执行某些类型的转换。

Employee myEmployee = myObject as Employee;

if (myEmployee != null)

{ }

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

的引用。如果myObject不兼容于Employee类型,as运算符会返回null。

注意:as运算符造成CLR只校验一次对象的类型。if语句只是检查myEmployee是否为null。这个检查的速度比校验对象的类型快得多。

as运算符的工作方式与强制类型转换一样,只是它永远不会抛出一个异常。相反,如果对象不能转换,结果就是null。所以,正确的做法是检查最终生成的一引用是否为null。如果企图直接使用最终生成的引用,会抛出一个System.NullReferenceException异常。以下代码对此进行了演示:

Object o = new Object(); 新建一个Object对象。

Employee e = o as Employee; 将o转型为一个Employee

e.ToString(); 访问e会抛出一个NullReferenceException异常

备注:

as运算符类似于强制转换操作。但是无法进行转换,则as返回null而非引发异常。

示例:

expression as Type它等效于以下表达式,但是只计算一次expression。

expression is Type ?(Type)expression : (Type)null

注意:as运算符只执行引用转换和装箱转换。as运算符无法执行其它转换,如果用户定义的转换,这类转换应使用强制转换表达式来执行。

Ellipse ell = sender as Ellipse; sender是事件源,,这句的意思是把引发该事件的事件源转成Ellipse类型as是用来强制类型转换的,,用as转换的好处是:转换失败不会出现异常,,而是返回NULL,,这样就比一般的转换安全

as 你可以把它理解成类型转换


单县17288223203: c#中as的用法、意思? -
卓物化瘀: MSDN给出的解释是:as 运算符用于在兼容的引用类型之间执行某些类型的转换.说明白了,就是把基类类型转换成派生类类型 比如Winform的ListBox的每一项都是object类型,将一个string丢进去以后,下次再取出的时候是一个object.这时候,想还原原来的字符串,就得对这个object做as string操作.

单县17288223203: C#中as 运算符的作用是什么?
卓物化瘀: as运算符用于执行引用类型的显式类型转换. 如果要转换的类型与指定类型兼容,转换就会成功;如果类型不兼容,则返回null.表达式as 类型as 运算符类似于类型转换,所不同的是,当转换失败时,as 运算符将返回null,而不是引发异常....

单县17288223203: C#中,AS类型转换怎么用? -
卓物化瘀: 关于类型的判断和转换有is和as这2个操作符.具体区别和用法如下 is就是处于对类型的判断.返回true和false.如果一个对象是某个类型或是其父类型的话就返回为true,否则的话就会返回为false.另外is操作符永远不会抛出异常.代码如下:...

单县17288223203: c#中的as起到什么用? -
卓物化瘀: 首先,BS复制的 as是用来类型转换的 比如:两个类:A和B B b = new B(); //不用as,进行强制转换,如果类型不匹配,会引发转换异常 A a = (A) b; //使用as,类型不匹配,不会引发异常,会返回一个null,此时 a = null A a = b as A;

单县17288223203: C#中as用法? -
卓物化瘀: Ellipse ell = sender as Ellipse; sender是事件源,,这句的意思是把引发该事件的事件源转成Ellipse类型as是用来强制类型转换的,,用as转换的好处是:转换失败不会出现异常,,而是返回NULL,,这...

单县17288223203: 在C#中,关于is和as的用法 -
卓物化瘀: 选择c 在c#中is用于类型判断,因为B是A的子类,所以表达式 b is A 的值为 true ; as用于类型转换

单县17288223203: C#as操作符用法?基类类型转换成派生类类型? -
卓物化瘀: 是的,用法例如:Button btn=new Button(); object ob=btn;...Button bn= ob as btn;//as 只可以用于引用类型,值类型不可以用(int ,short) if(bn!=null)//一定要判断,防止转换失败 { }

单县17288223203: 请教一下关于C#中as的用法和意义 -
卓物化瘀: 把dataGrid1.SelectedItem的类型转换成VariableAttribute,等价于 OFFLineData.BrowseNativeData.bindingvariable = (VariableAttribute)dataGrid1.SelectedItemas; 不过用as跟安全,高效

单县17288223203: 请问C#中关键字is 和as 的用法,还有params -
卓物化瘀: is:检查对象是否与给定类型兼容.例如,可以确定对象是否与 string 类型兼容,如下所示:if (obj is string) { // } as:用于在兼容的引用类型之间执行转换.例如:string s = someObject as string; if (s != null) { // someObject is a string.} as 运算符...

单县17288223203: 请教一下关于C#中as的用法和意义OFFLineData.BrowseNativeData.bindingvariable = dataGrid1.SelectedItem as VariableAttribute;请问这是什么意思? -
卓物化瘀:[答案] 把dataGrid1.SelectedItem的类型转换成VariableAttribute,等价于OFFLineData.BrowseNativeData.bindingvariable = (VariableAttribute)dataGrid1.SelectedItemas;不过用as跟安全,高效

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网