C# 这些是装箱/拆箱示例吗

C# 这些是装箱/拆箱示例吗,c#,boxing,unboxing,C#,Boxing,Unboxing,是否有2个和3个装箱/拆箱示例 1)文档示例: int i = 123; object iBoxed = i; i = (int) iBoxed; 2:装箱/拆箱也一样吗? int i = 123; object iBoxed = i; i = Int32.Parse(iBoxed.ToString()); int i = 123; object iBoxed = i; i = Convert.ToInt32(iBoxed); 3:装箱/拆箱也是吗? int i = 123; object

是否有2个和3个装箱/拆箱示例

1)文档示例:

int i = 123;
object iBoxed = i;
i = (int) iBoxed;
2:装箱/拆箱也一样吗?

int i = 123;
object iBoxed = i;
i = Int32.Parse(iBoxed.ToString());
int i = 123;
object iBoxed = i;
i = Convert.ToInt32(iBoxed);
3:装箱/拆箱也是吗?

int i = 123;
object iBoxed = i;
i = Int32.Parse(iBoxed.ToString());
int i = 123;
object iBoxed = i;
i = Convert.ToInt32(iBoxed);
我假设在所有的例子中,技术上都是一样的

  • 在堆栈上创建值类型
  • 在堆栈上创建引用时,将值复制到堆中
  • 堆值被复制到引用中。引用被删除

  • 所以我想2和3是装箱/拆箱的例子?

    装箱的是
    对象iBoxed=I

    示例2不起作用,因为在所有三个示例中,
    int.Parse
    需要一个字符串:

    iBoxed
    i
    的盒装副本

    在示例2中: 这里不涉及拆箱,因为
    ToString
    是一个虚拟方法,最终将解析为
    int.ToString
    ,然后由
    int.Parse
    解析,并在堆栈上返回一个非装箱的
    int

    在示例3中:
    iBoxed
    将在方法体
    Convert.ToInt32
    中取消装箱,并作为非装箱整数返回堆栈。

    第二个示例是装箱,但不是取消装箱。无法编译int.parse,因为它需要一个字符串,而iBoxed是一个对象。我认为你是在混合拳击和转换的概念。装箱实际上就是像他们在C中所说的那样获取一个值类型ie POD,并将其视为引用取消装箱是从其容器中提取相同值类型的能力

    例2。固定的

    int i = 123;  // Assigment 
    object iBoxed = i ; // This is boxing 
    i = int.parse(iBoxed.toString());  //This is unboxing but only for the twostring method the assignment is a value type copy. 
    

    在所有示例中,值类型
    i
    正在转换为对象。这是拳击的定义。拳击也可以通过以下方式完成:

    object boxed = (object)i;
    
    取消装箱是将对象转换回值类型。
    示例1是拆箱

    示例2将无法编译,因为
    Parse
    需要一个
    string
    参数,但如果使用
    iBoxed.ToString()

    示例3我怀疑没有取消装箱,因为
    Convert
    方法将只返回您传入的值


    值得注意的是拳击和拆箱的表现。它比普通赋值更昂贵。

    我认为是这样,因为你把int放在一个对象“框”中,然后把它从那个框中去掉。box和unbox背后的思想是将值类型更改为引用类型,backI修复了示例2,该示例没有编译。