实例化“AS”关键字

时间:2009-03-04 11:59:04

标签: c# json keyword boxing unboxing

我最近开始使用JSON和ExtJs框架,我在一个例子中遇到了以下代码。

我们使用以下方法从前端检索信息:

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

然后在示例中,他们执行以下操作:

JavaScriptObject jsObj = updatedConfig as JavaScriptObject;

我从未见过像以前那样使用的“as”关键字。这只是将updatedConfig变量明确地装入JavaScript对象的另一种形式,还是我不了解这个?

由于

4 个答案:

答案 0 :(得分:4)

这被称为安全演员阵容。它的作用是尝试从一种类型转换为另一种类型,如果转换失败则返回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以获取更详细的说明。

答案 1 :(得分:3)

as keyword是一种在C#中转换对象的更安全的方法。

SomeType a = obj as SomeType;

表示如果obj属于SomeType类型,obj将被投射到该类型中。如果obj为空或不是SomeType类型,则a将为空。

答案 2 :(得分:0)

as关键字的另一个优点是,如果无法转换类型,它将抛出编译时异常,而(cast)在运行时不会中断。

答案 3 :(得分:0)

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

通常它并不重要,但是如果你实现了一个强制转换函数(比如MSDN中的那个),那么使用as运算符将来调用它。

因此,as运算符对于“上下继承hiearchy”很有用:如果你有一个Person类,你可以这样做: 人p =新人(); ojbect o = p作为对象; p = o as Person; 但是在所有情况下,内存中的对象都不会以任何方式被修改,只是对它的引用。

希望有所帮助

相关问题