C# as用法

问题

写GIS程序设计的降雨量项目时,遇到as类型转换后,不用新变量,仍然用老的被转换的变量。对这一用法及其具体所指感到好奇。
相关代码如下:

//设置字段
//可以缩写为IFieldsEdit fieldsEdit = (new Fields()) as IFieldsEdit;
IFields fields = new Fields();
IFieldsEdit fieldsEdit = fields as IFieldsEdit; //用于修改一组字段
//....转换后又重新用到fields变量
IFeatureClass featureClass = featureWorkspace.CreateFeatureClass(sFileName, fields, null, null, esriFeatureType.esriFTSimple, "Shape", "");

回答(直接解决问题)

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运算符无法执行其它转换,如果用户定义的转换,这类转换应使用强制转换表达式来执行。

as和is用法的详细参考可见C#中as用法

C#类型转换总结

Object => 已知引用类型——使用as操作符完成;
Object => 已知值类型——先使用is操作符来进行判断,再用类型强转换方式进行转换;
已知引用类型之间转换——首先需要相应类型提供转换函数,再用类型强转换方式进行转换;
已知值类型之间转换——最好使用系统提供的Conver类所涉及的静态方法。

  • 15
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值