2009-03-04 149 views
2

我最近开始使用JSON和ExtJs框架,并在示例中遇到以下代码。实例化“AS”关键字

我们使用这个检索来自前端的信息:

object updatedConfig = JavaScriptConvert.DeserializeObject(Request["dataForm"]); 

然后在例如他们做到以下几点:

JavaScriptObject jsObj = updatedConfig as JavaScriptObject; 

我从来没有见过的“为”关键字使用这样的之前。这是另一种显式装箱作为JavaScriptObject的updatedConfig变量的形式,还是有什么我不明白这一点?

感谢

回答

3

这被称为安全演员。它试图从一种类型投射到另一种类型,如果投射失败,则返回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指令。

有关更详细的解释,请参阅Casting vs using the 'as' keyword in the CLR

2

as keyword是投在C#中的对象更安全的方式。

SomeType a = obj as SomeType; 

表示如果obj是SomeType类型,obj将被转换为该类型。如果obj为null或不是SomeType类型,则a将为null。

+1

这也是更快地使用“为”和检查空比检查与“是”的类型,然后做一个硬铸铁。在后一种情况下,类型将被检查两次。 – 2009-03-04 12:05:42

0

as关键字的另一个优点是,如果类型不能被转换,那么它将抛出编译时异常,因为(cast)直到运行时才会中断。

0

此外,重要的是要记住,“as”在参考中操作而不是在对象本身中操作。这就是为什么它可以返回null而不是抛出异常,因为对象将保持不变。这就是为什么你只能在引用类型上做到这一点。通过使用as运算符可以调用而不是

因此,as运算符对于“继承和继承hiearchy”是有用的:如果您有一个Person类,您可以执行: Person p = new Person(); ojbect o = p作为对象; p = o as Person; 但是在任何情况下,内存中的对象都不会以任何方式修改,只是对其的引用。

希望帮助