原文链接
版权声明:本文为CSDN博主「芝麻团坚果」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:blog.csdn.net/weixin_4591…
正文
问题
写 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 类所涉及的静态方法。
C# 中 as 和 is 的区别
as 模式的效率要比 is 模式的高,因为借助 is 进行类型转换,需要执行 两次 类型兼容检查。而 as 只需要做 一次 类型兼容,一次 null 检查,null 检查要比类型兼容检查快。
is 关键字是判断类型,用于检查对象是否与给定类型兼容,不成功则不会抛出异常,如果兼容则返回 true 如果不兼容则返回 false。在进行类型转换之前用
if (P_obj is System.String)
{
string objStr = (string)P_obj;
MessageBox.Show("与类型兼容", "提示!");
}
else
MessageBox.Show("与类型不兼容", "提示!");
在上面的例子中进行 两次 兼容性检查,一在判断时 P_obj is System.String,另一次在转换 (string)P_obj 时。用 as 只需要 一次。
as 关键字是转换,可以将对象转换为指定类型,与 is 不同,转换成功将会返回转换后的对象,不成功则不会抛出异常而是返回 null 。
string objStr = P_obj as string;
if (objStr != null)
MessageBox.Show("与类型兼容", "提示!");
else
MessageBox.Show("与类型不兼容", "提示!");