【问题标题】:Instantiate "AS" keyword实例化“AS”关键字
【发布时间】:2009-03-04 11:59:04
【问题描述】:

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

我们使用这个从前端检索信息:

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

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

JavaScriptObject jsObj = updatedConfig as JavaScriptObject;

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

谢谢

【问题讨论】:

    标签: c# json keyword boxing unboxing


    【解决方案1】:

    这被称为安全施法。它的作用是尝试从一种类型转换为另一种类型,如果转换失败,它会返回 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;
      

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

      【讨论】:

      • 使用 'as' 并检查 null 也比使用 'is' 检查类型然后进行硬转换更快。在后一种情况下,类型将被检查两次。
      • @DaveVandenEynde 有趣的是,Jon Skeet 在他的 C# in Depth 2nd Edition 中提到,他对 asis 进行了一些时间安排,并对其中 1/3 的对象数组进行了转换't 装箱整数并发现 is 加上演员表快 20 倍。 (第 121 页)对我来说似乎违反直觉......但我的测试证实了这一点。
      • @itsmatt 你能添加章节/章节参考吗?第 121 页是关于可空类型的。
      • @DaveVandenEynde 4.3.5 是该部分。在“令人惊讶的性能陷阱”段落中。
      • @itsmatt 谢谢。这确实令人惊讶,但我应该补充一点,它涉及大量拆箱,这可能会影响铸造的性能。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        希望有帮助

        【讨论】:

          猜你喜欢
          • 2011-03-05
          • 1970-01-01
          • 1970-01-01
          • 2021-01-11
          • 1970-01-01
          • 1970-01-01
          • 2021-05-16
          • 2019-09-10
          • 2012-12-01
          相关资源
          最近更新 更多