【问题标题】:What is difference between normal typecasting and using “AS” keyword [duplicate]普通类型转换和使用“AS”关键字有什么区别[重复]
【发布时间】:2011-04-13 01:11:08
【问题描述】:

可能的重复:
Direct casting vs 'as' operator?
Casting: (NewType) vs. Object as NewType

普通类型转换和使用“AS”关键字有什么区别?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    如果对象的类型错误,使用as 将正常失败,并且结果值将为空,正常转换会抛出 InvalidCastException:

    object x = new object();
    string y = x as string; // y == null
    string z = (string)x; // InvalidCastException
    

    【讨论】:

      【解决方案2】:

      这两个运算符的用例表面上相似,但语义上却大不相同。演员向读者传达“我确信这种转换是合法的,如果我错了,我愿意接受运行时异常”。 “as” 运算符传达“我不知道这种转换是否合法;我们将试一试,看看效果如何”。

      有关此主题的更多信息,请参阅我关于该主题的文章:

      http://blogs.msdn.com/b/ericlippert/archive/2009/10/08/what-s-the-difference-between-as-and-cast-operators.aspx

      【讨论】:

      • 它可以传达,但不一定。当我确定转换会起作用时,我使用了as 关键字,因为我只是更喜欢看:(myobj as MyType).SomeProperty 而不是((MyType)myobj).SomeProperty 在这种情况下,我所做的方式表明我愿意如果没有,请在运行时使用NullReferenceException。只是想指出这是一种风格。
      • @jasonh - 以这种方式使用as 对我来说在风格上是错误的。这会让我们想知道为什么没有完成演员表。此外,与空引用异常相比,无效的强制转换异常会导致开发人员更快地解决问题。我更喜欢 Eric 的风格。
      【解决方案3】:

      as 转换不会抛出异常,而通常的转换可以。

      Object a = new Object();
      String b = a as String;
      if(b != null) // always false for this example.
      {}
      

      【讨论】:

        【解决方案4】:

        普通类型转换可能会返回 IllegalTypeCast 异常,而 as 在这种情况下将返回 null

        【讨论】:

          【解决方案5】:
          ((Class2) obj)  // Throws exception when the casting cannot be made
          
          Class2 C = obj as Class2  //  Will return NULL if the casting cannot be made
          

          【讨论】:

            【解决方案6】:

            如果您使用“as”关键字,您将永远不会遇到转换异常。如果您尝试进行无效转换,则转换结果将为 null

            可以在具有继承/实现关系的类/接口之间使用隐式/显式转换,否则会产生编译错误。见例子:

            public class A {}
            public class B {}
            ...
            A a = new A();
            //B b = (B)a;  //compile error:Cannot implicitly convert type 'A' to 'B'
            

            隐式/显式转换的另一种情况是A类和B类没有关系,但是你自己写了一个implicit/explicit操作符。

            【讨论】:

              【解决方案7】:

              另外,as 只能用于引用类型。这实际上是很合乎逻辑的,因为如果转换失败,它会返回 false,而这对于值类型来说是不可能的。

              所以对于值类型,必须使用正常的类型转换。

              【讨论】:

                【解决方案8】:

                as 不能与值类型(不可为空的类型)一起使用。

                对于引用类型...

                expression as type
                

                其实是一样的

                expression is type ? (type) expression : (type) null
                

                除了expression 只计算一次。

                向比尔·克林顿致敬,“表达就是类型”中的“是”,我的意思是“is”。

                基本上,正如其他答案所表明的那样,这意味着当强制转换失败时 as 返回 null 。但是,当强制转换成功但类型错误时,它也会返回 null。

                这是一个有点傻的例子:

                uint? u = 52;
                int? i = (int?) u;   // 'i' is now 52
                

                但是

                uint? u = 52;
                object d = u;
                int? i = d as int?;
                

                i 的值是多少? 52?没有。为空。

                为什么里面有物体?原来我在上面用“is”解释“as”时撒了谎。

                观察:

                uint? u = 52;
                int? i = (u is int?) ? (int?) u : (int?) null;
                

                'i' 现在是 null

                uint? u = 52;
                int? i = u as int?;
                

                哎呀。编译器错误。所以,我猜这两种说法毕竟不完全一样。

                【讨论】:

                • 简而言之:is is is and as is also as is as is。
                • 不仅如此,我还要编写使用'?'的C#就像 Lisp 使用括号一样。 :-)
                猜你喜欢
                • 2011-10-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-01-23
                • 2018-07-21
                • 2011-08-12
                • 2011-02-25
                相关资源
                最近更新 更多