代码之家  ›  专栏  ›  技术社区  ›  StevenMcD

实例化“as”关键字

  •  2
  • StevenMcD  · 技术社区  · 15 年前

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

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

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

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

    JavaScriptObject jsObj = updatedConfig as JavaScriptObject;
    

    我从来没有见过像这样使用“as”关键字。这是将updatedconfig变量显式装箱为javascriptObject的另一种形式,还是有什么我不理解的地方?

    谢谢

    4 回复  |  直到 6 年前
        1
  •  4
  •   Community Daniel Roseman    7 年前

    这就是所谓的安全铸造。它尝试从一种类型转换为另一种类型,如果转换失败,它将返回 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
  •  3
  •   HSchmale    6 年前

    这个 as keyword 是在C中投射物体的一种更安全的方法。

    SomeType a = obj as SomeType;
    

    意味着如果 obj 属于类型 SomeType , OBJ 将被强制转换为该类型。如果 OBJ 为空或不是类型 基类型 ,a将为空。

        3
  •  0
  •   Sruly    15 年前

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

        4
  •  0
  •   rgargente Chelsea Urquhart    15 年前

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

    通常情况下,这并不重要,但是如果您实现了一个强制转换函数(如 MSDN 它会 使用as运算符调用。

    因此,as运算符对于“向上和向下移动继承层次结构”很有用:如果您有一个类人员,则可以执行以下操作: person p=new person(); ojbect o=p作为对象; P=O为人; 但是,在所有情况下,内存中的对象都不会以任何方式被修改,只是对它的引用。

    希望有所帮助