因此,每个结构只包含值类型的值和/或对引用类型的引用,这些引用类型具有已知大小。
所以演示结构:
struct demo
{
public int a = 7;
public string b = "test";
}
会出现在内存中(模糊地):
struct demo
{
public int a = 00000000000000000000000000000111
public string b = 0x80484f0
}
结果,struct是一个值类型,它将其内容存储在堆栈中分配的内存中。
我只需要澄清这一点,因为我不确定结构如何成为值类型。
答案 0 :(得分:3)
结构可以被视为值类型(例如,它们在作为参数传递时被复制,并在数组中内联存储等),因为它们的大小在抖动的编译时间是已知的(或者,更精确,因为它们的大小可以从变量/字段的声明类型推断出来。
Whyyy 在编译时是否知道它们的大小?它不是因为"每个结构只包含值类型的值,和/或对引用类型的引用,它们具有已知的大小。" - 对于参考类型也可以这样说。
它们的大小在编译时是已知的,因为不允许继承。如果您可以继承demo
,那么demo
类型的变量可能指向比demo
大得多的对象。
假装你可以子类化结构,并记住值类型以内联方式存储在数组中:
//4 bytes (1 integer)
public struct A {int x;}
//8 bytes (2 integers)
public struct B : A {int y;}
//An array of A's with enough space for 1 instance of A, that is, 4 bytes
A[] array = new A[1];
//instances of B don't fit in the array
a[0] = new B();
正如Matthew在评论中指出的那样,C ++允许你这样做,但是字段B.y
将被修剪并丢失。
答案 1 :(得分:0)
正如您所说,它将其内容存储在堆栈上而不是堆上。因此它必须是一个值类型。