【问题标题】:How does casting work?铸造是如何工作的?
【发布时间】:2010-11-12 11:54:10
【问题描述】:

我想知道当您将 object 转换为 int 时,C# 会做什么。

object o = 10;
int i = (int) o;

非常感谢:)!

【问题讨论】:

    标签: c# casting


    【解决方案1】:

    在一般情况下,这是一个棘手的问题;p 这取决于确切的场景:

    • (当目标是值类型时)如果源值只知道object,这是一个unbox操作,它颠倒了值类型可以被存储在对象引用中 (Unbox / Unbox_Any)
    • 如果源类型是Nullable<int>,则评估.Value 属性(如果值为空,则会导致异常)
    • 如果源类型是规范中记录的少数内置类型之一(uintfloat 等),则发出特定的操作码(可能根本没有)以执行转换直接在 IL (Conv_I4)
    • 如果源类型定义了自定义的隐式或显式转换运算符(与目标类型匹配),则该运算符调用作为静态方法 (Call)
    • (在引用类型的情况下)如果它显然并不总是不正确(不同的层次结构),则执行引用转换/检查 (CastClass)
    • 否则编译器会将其视为错误

    认为那是相当完整的?

    【讨论】:

      【解决方案2】:

      这是一个装箱和拆箱的例子:

      http://msdn.microsoft.com/en-us/library/yz2be5wk(VS.80).aspx

      C# 正在获取 int 的值类型(也许它是一个局部变量,在寄存器中或堆栈上),将它装箱到一个对象中,然后将它放在堆上。当你转换回 int 时,这个过程是相反的。

      更一般地说,编译器在强制转换时会创建非常复杂且特定于类型的 IL,特别是它必须确保在运行时您正在强制转换的类型是兼容的,查找代码中定义的特定强制转换运算符,处理溢出等等等等。铸造是一个相当昂贵的过程。

      【讨论】:

      • 隐式转换是否会发生同样的过程?所以:object o = myClass
      • 否 - 如果 myClass 不是值类型,则此处不会发生实际的类型转换代码或装箱。像这样向下转换继承链是一个简单的案例,因此您会期望非常快速和简单的 IL 输出。 o 引用的对象仍然是 myClass 引用的对象。
      【解决方案3】:

      在这种特殊情况下,它称为“拆箱”,请查看http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx

      【讨论】:

        【解决方案4】:

        在这里查看有关以下信息的信息:Casting

        另外,值得一读:Boxing and Unboxing

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-02
          • 1970-01-01
          • 1970-01-01
          • 2023-04-04
          相关资源
          最近更新 更多