C#中的"Boxing"是什么意思(而不是Java)?

use*_*059 6 c# java

我正在从Java背景学习C#并且对ValueTypes 有些困惑.我从阅读MSDN的C#vs Java概述中得到的理解是,原语是对象而不是包装器.如果是这种情况,为什么需要将它们装箱以调用方法?看起来他们的意思不同于Java的自动装箱,但我不确定是什么.它看起来更像是铸造.

And*_*rey 10

拳击是Java和C#中非常相似的概念.不同之处在于它何时发生:

Character ch = 'a';
Run Code Online (Sandbox Code Playgroud)

这将导致Java中的装箱,因为'a'是原始的而Character是class(包装器).在C#中:

Char ch = 'a';
Run Code Online (Sandbox Code Playgroud)

不会导致装箱,因为Char它不是原始类型,而是值类型类.要在C#中进行装箱,您需要将值类型的对象转换为object引用.

object o = 'a';
Run Code Online (Sandbox Code Playgroud)

编辑:正如HighCore在评论中所提到的,C#中的拳击机制有重要意义.把东西放入List<int>不会导致装箱和取出东西不会导致拆箱,因为整数列表是未装箱的整数的真实列表.

  • 我认为向java的新手提及C#的泛型设计是否正确,并且没有"类型擦除"这样的东西以及他可能习惯于java的其他可憎之处,以及创建`List <int> `在C#中完全有效. (2认同)