结构是值类型,因为它们的结构在编译时是已知的吗?

时间:2014-11-13 10:22:45

标签: c#

因此,每个结构只包含值类型的值和/或对引用类型的引用,这些引用类型具有已知大小。

所以演示结构:

struct demo
{
        public int a = 7;
        public string b = "test";
}

会出现在内存中(模糊地):

struct demo
{
    public int    a = 00000000000000000000000000000111
    public string b = 0x80484f0
}

结果,struct是一个值类型,它将其内容存储在堆栈中分配的内存中。

我只需要澄清这一点,因为我不确定结构如何成为值类型。

2 个答案:

答案 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)

正如您所说,它将其内容存储在堆栈上而不是堆上。因此它必须是一个值类型。