如果我写
int i=100;
然后将它作为int
存储在内存中,占用4个字节或存储为object
,并在其检索时使用取消装箱概念(从对象类类型对象中提取int)。
答案 0 :(得分:3)
在你的例子中没有没有装箱,int只需4个字节。只有在object
变量中手动存储值类型时才会发生限制。
int i = 100; // No boxing
i = i + 1; // No boxing
object o = i; // Boxing
int j = (int)o; // Unboxing
答案 1 :(得分:0)
理解装箱的最简单方法是了解一些细节如何在CLI / CLR(从C#或其他.net编译器执行输出的框架层)中处理值类型和引用类型。特别是,需要认识到,对于每种值类型,框架还定义了一个相应的密封引用类型,该类型派生自类System.ValueType
(后者继承自System.Object
)并具有相同的公共和私有字段作为原始值类型(*)。值类型的存储位置始终保持值类型,而引用类型的存储位置始终保持引用类型。没有例外。如果尝试在需要引用类型的情况下使用值类型,系统将创建与该值类型对应的引用类型的新实例,从要存储的值复制公共和私有字段,以及然后使用那个新实例。这被称为“拳击”。
请注意,虽然C#假装所有值类型都继承自System.Object
,但这样的语句依赖于松散的“继承”定义,这种定义可能比有用更容易混淆。如果定义语句“X
继承Y
”表示“X
的实例可以隐式用作Y
的实例”,则未装箱的值类型会执行不继承Object
,但可以将它们的值复制到盒装值类型的实例中。