2013-02-11 55 views
3

我有一个struct类型,称为节点如下图所示:为什么我不能在C#中的struct中具有相同的struct type属性?

struct Node 
{ 
    int data; 
    Node next; 
} 

我得到编译时错误,当我编译上面的代码,但如果我让一个类,一切都很好。

class Node 
    { 
     int data; 
     Node next; 
    } 

是哪两种(我知道一个是struct (value type),一个是class(ref type))之间的区别?

+1

因为你会吹堆栈。 – leppie 2013-02-11 15:33:51

+9

您对价值类型和参考类型之间的差异了解多少?你期望你的'Node'结构的* size *是什么? (鉴于它必须包含另一个'Node'结构和一个'int' ......) – 2013-02-11 15:33:55

+0

您的结构大小将总和为无穷大......并超越! – 2013-02-11 15:37:46

回答

2

你有没有使用C语言编程?你知道吗,类/结构和指针等?如果你有这样的话,请记住:在C#中,“类”是作为指针传递的,而“结构体”是以原始二进制形式传递的,它们就像任何非指针式非引用一样被复制C/C++。所有其他的嵌套限制都保留下来,只是名称不同而已。

在C#中,您可以有一个'class X'包含'class X'类型的字段,因为“classes”不会直接放在任何位置。这个字段实际上是一个4/8字节的指针/引用。 'X级'的大小很容易确定。相比之下,在C#中,不能有包含'struct X'类型字段的'struct X'。这样的字段可以直接嵌入到外部结构中,而不是通过指针/引用。如果'X结构'包含另一个'结构X',它肯定会通过它的定义包含另一个'结构X',它将包含....结尾是什么?你会如何标记结局?在编写“new X()”时,编译器/运行时如何知道需要分配多少空间?就像在C/C++中一样,你不能直接创建递归嵌套类型(只能通过指针/引用来完成),在C#中你不能创建递归结构。

+2

我的眼睛.... – 2013-02-11 15:41:08

+0

如果你的眼睛因为C#/ CLR /等内部机制的不完美描述而感到痛苦,那么试着用冷水冲洗它们:)它是100%的意图不是完美的,而是对于C/C++编码人员来说很容易理解,因为在这种环境中,由于类似但不同的术语,他们经常在C#中发现问题。 – quetzalcoatl 2013-02-11 15:51:19

3

如果您定义class,Node只是参考引用类型Node。在结构化的情况下,您嵌套了Node stuct,即节点中的循环嵌套节点。

相关问题