我最近开始使用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; 但是在所有情况下,内存中的对象都不会以任何方式被修改,只是对它的引用。

希望有所帮助

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top