4

从 MSDN 中它说“值类型是在堆栈上或内联上分配的。

“内联分配”是否意味着值类型可以在声明后立即分配?说如果它是在一个Heap中声明的,那么它是在下一个Heap slot中分配的?

那为什么说“在一个结构中”?

更新

如果“结构”特指“结构”,为什么它没有提及“类”?作为 a 中的字段Class,它不在堆栈上,也不在 a 中内联struct,(它在 a 中内联class)。

4

2 回答 2

3

它们在结构中内联分配,因此作为已分配给结构的内存的一部分。

看:

http://msdn.microsoft.com/en-us/library/system.valuetype.aspx

如果您有嵌套值类型,则内部类型将分配在已为包含类型分配的内存中。

struct Inner
{
    public int A;
}

struct Outer
{
    public Inner I;
    public int B;
}

Outer o = new Outer();
o.I = new Inner();

内存I是内联分配的,在分配给 的实例的内存中Outer

于 2012-04-27T22:11:00.140 回答
1

将结构视为最简单的方法是将一组存储位置用胶带粘在一起。声明一个变量或字段Point foo;本质上等同于说int Point_X; int Point_Y;。说foo = bar;,当两者都是类型时Point,本质上等同于说foo_X = bar_X; foo_Y = bar_Y;。将结构作为值参数传递本质上等同于将其所有字段(公共和私有)作为值参数传递。

有两种结构方式和一种主要是语法糖的方式,其中结构不仅仅是用胶带粘在一起的一组字段:

  1. 可以将结构体作为 `byref` 参数传递,在这种情况下,系统会传递一个对整个存储位置组的引用(与单独传递存储位置不同,在按值传递时有效)。
  2. struct 类型数组的每个 slot 都会将其所有存储位置放在一起,因此 `Point foo[];` 与 `int foo_X[]; 非常不同;int foo_Y[];`。前一个声明表示一个数组,每个元素有两个存储位置,而后一个声明表示两个数组,每个元素一个存储位置。
  3. 可以将方法和属性与结构相关联,并定义结构字段,这些字段只能通过这些方法和属性访问,或者通过对结构的所有字段执行类似赋值的操作来访问。

类类型与结构非常不同。如果一个人声明了一个具有字段 P 和 Q 的类,并且一个人声明了该类类型的存储位置,那么该存储位置将不会保存两个东西(P 和 Q)。它只会保存一件事——对存储在其他地方的对象的引用,该对象本身具有字段 P 和 Q。

于 2012-05-17T21:31:27.980 回答