实例化“ AS”关键词
题
我最近开始使用JSON和ExtJs框架,我在一个例子中遇到了以下代码。
我们使用以下方法从前端检索信息:
object updatedConfig = JavaScriptConvert.DeserializeObject(Request["dataForm"]);
然后在示例中,他们执行以下操作:
JavaScriptObject jsObj = updatedConfig as JavaScriptObject;
我从未见过“as”之前使用的关键字。这只是将updatedConfig变量明确地装入JavaScript对象的另一种形式,还是我不了解这个?
由于
解决方案
这被称为安全演员阵容。它会尝试从一种类型转换为另一种类型,如果转换失败则返回 null
而不是抛出 InvalidCastException
。
实际上有两个单独的IL指令来处理“ as
”之间的区别。铸造和常规静态铸造。以下C#代码包含两种类型的转换:
using System;
class Program
{
static void Main()
{
Object o = null;
String s0 = (String)o;
String s1 = o as String;
}
}
第一个转换使用 castclass
IL指令,第二个转换使用 isinst
指令。
请参阅使用'as'关键字进行投射与使用'as'关键字CLR 有更详细的解释。
其他提示
作为关键字更安全在C#中转换对象的方法。
SomeType a = obj as SomeType;
表示如果 obj
的类型为 SomeType
,则 obj
将被转换为该类型。如果 obj
为null或者不是 SomeType
类型,则a将为null。
as关键字的另一个优点是,如果无法转换类型,它将抛出编译时异常,而(cast)在运行时不会中断。
此外,重要的是要记住“as”;在参考中操作而不是在对象本身中操作。这就是为什么它可以返回null而不是抛出异常,因为该对象将保持不变。这就是为什么你只能在引用类型上做到这一点。
通常它并不重要,但是如果你实现一个转换函数(比如 MSDN )使用as运算符 not 将被调用。
因此,as运算符对于“继承上下传递层次结构”非常有用:如果你有一个Person类,你可以这样做: 人p =新人(); ojbect o = p作为对象; p = o as Person; 但是在所有情况下,内存中的对象都不会以任何方式被修改,只是对它的引用。
希望有所帮助