2

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

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

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

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

JavaScriptObject jsObj = updatedConfig as JavaScriptObject;

我以前从未见过像这样使用“as”关键字。这只是将 updatedConfig 变量显式装箱为 JavaScriptObject 的另一种形式,还是我对此不了解?

谢谢

4

4 回答 4

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;
    }
}

第一次转换使用castclassIL 指令,第二次转换使用isinst指令。

有关更详细的说明,请参阅CLR 中的 Casting vs using the 'as' 关键字。

于 2009-03-04T12:02:41.887 回答
3

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

SomeType a = obj as SomeType;

意味着 ifobj是 type SomeTypeobj将被强制转换为该类型。如果obj为 null 或不是 type SomeType,则 a 将为 null。

于 2009-03-04T12:02:34.853 回答
0

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

于 2009-03-04T12:18:18.747 回答
0

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

通常没那么重要,但是如果你实现了一个强制转换函数(就像MSDN中的这里),它不会被 as 操作符调用。

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

希望有帮助

于 2009-03-04T12:56:24.083 回答