在C#中,“Boxing”是什么意思(与Java相比)?

8

我从Java背景开始学习C#,对于ValueType有些困惑。通过阅读MSDN的C# vs Java概述,我的理解是原始类型是对象而不是具有包装器。如果是这样,为什么需要将它们打包才能调用方法?它们似乎与Java的自动装箱不同,但我不确定具体区别。看起来更像是强制转换。

1个回答

11

拳击在Java和C#中的概念非常相似,唯一的区别是发生的时间:

Character ch = 'a';

这会在Java中导致装箱,因为'a'是原始类型,而Character是类(包装器)。

在C#中:

Char ch = 'a';

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

object o = 'a';

编辑:正如HighCore在评论中提到的,C#语言中的装箱机制有着重要的含义。将内容放入 List<int> 中不会导致装箱,取出内容也不会导致拆箱,因为List<int>是真正的未装箱整数列表。


2
我认为对于一个从Java转来的新手来说,提到C#的泛型是经过适当设计的,并且不存在"类型擦除"和其他他可能从Java中习惯的可怕事情是很重要的。同时,在C#中创建List<int>是完全有效的。 - Federico Berasategui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接