【转载】C# as 用法

665 阅读3分钟

原文链接

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

asis 用法的详细参考可见 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("与类型不兼容", "提示!");