有代码:
struct A
{
int b;
}
class B
{
A a;
int b;
}
问题是:
我真的不明白:(
答案 0 :(得分:7)
1)不,这里没有拳击。
2)a
将在堆上,尽管这是一个实现细节
3)否,b
中的A
未加框
4)b
中的A
将存在于包含A
的所有位置(因此,对于A
类型的局部变量,它通常位于堆栈中;使用类B
之类的实例变量或任何静态变量,它将在堆上);再次,这是一个实现细节
5)b
中的B
未加框
6)b
中的B
将在堆上 - 再次,实现细节
此处没有拳击,因为您没有显示任何尝试将值类型值用作引用类型值(例如object
或接口)的任何内容。
同样,整个堆栈/堆的区别是一个实现细节。你应该阅读Eric Lippert的blog posts on the topic。
答案 1 :(得分:2)
使用Google我找到this:
拳击和拆箱是C#类型系统中的一个基本概念。使用Boxing和unboxing,可以通过允许将value-type的任何值转换为和,来实现值类型和引用类型之间的链接。 来自类型对象。装箱和拆箱可以实现类型系统的统一视图,其中值为any 类型最终可以被视为一个对象。 将值类型转换为引用类型称为Boxing。拆箱是一项明确的操作。
Boxing正在将值类型转换为引用,并且不在您的代码中。所以回答你的“b-boxed”问题是“不”。
答案 2 :(得分:1)
答案 3 :(得分:0)
通过引用传递值类型也不是装箱。
void SomeFunction(ref int a)
a没有盒装。
int? value
可以为Nullable值的类型也不加框。
object my_box = my_integer
my_value是my_integer的盒装版本
类中包含的值类型没有装箱(如果是这种情况,它何时会是值类型?)
答案 4 :(得分:0)
结构类型的存储位置(变量,参数或字段)包含在其中,该类型的所有字段(公共字段和私有字段)。如果存储位置作为自动变量或参数保存在堆栈上,则其所有字段都是相同的。如果存储位置存在于堆对象中,则其字段将位于相同的堆对象中。
通过为每个值类型定义具有相同名称和成员的类类型,Boxing在内部工作。当为需要类类型的代码提供值类型值时,系统会生成同名类类型的新实例,并将所有字段(public和private)从value-type值复制到新对象实例。尽管C#规范将盒装实例描述为值类型,但其行为和内部工作方式将是类类型。