public class Node
{
public int Value { get; set; }
public Node Next { get; set; }
}我是一个完全的编程初学者。我决定学习C#作为我的第一门编程语言。我偶然发现了这段代码。
如何将'Node‘定义为Next的数据类型?这让我很困惑。
发布于 2020-04-25 03:27:59
在学习C#的过程中,这是一个很好的问题。关键是C#中有两种类型:“值”类型和“引用”类型。参见this question and its answers for more details。
因为Node被声明为class,这意味着它是一个引用类型。如果将变量设置为引用类型,则该变量不会直接保存数据;相反,它会保存一个可以指向数据的引用。默认情况下,引用具有特殊的值null,这意味着它们不指向任何东西。当你给一个变量赋值时,比如myNode.Next = someOtherNode,你不会把整个someOtherNode复制到Next属性中;你只需要把对someOtherNode的引用复制到这个属性中。
因此,由于Node类本身具有Node属性,因此Node对象实际上并不包含另一个Node对象。第一个对象包含对第二个对象的引用。这允许一个节点指向另一个节点,然后该节点可以指向另一个节点,依此类推。以这种方式组织的节点集合称为链表;在本例中,它是int (32位整数)值的链表。
如果Node是一个值类型(声明为struct而不是class),那么确实会有问题。值类型变量直接包含数据,因此您不能拥有包含同一值类型的另一个实例的值类型的实例。
发布于 2020-04-25 03:32:25
像其他答案一样,这个类表示链表的一个节点。在这种情况下,Node可以指向节点的另一个实例。
Node
{
int Value = 1;
Node Next =============> Node {
} int Value = 2;
Node Next ===========> Node {
} int Value = 3;
Node Next =======> null
}您通常不会遇到像Node这样具有自身引用的类。
发布于 2020-04-25 03:08:52
这被称为链表,递归数据结构的一个例子。这可以很容易地在C#中实例化,因为可以通过让列表中的最后一个节点为Next属性的空值来结束递归。
https://stackoverflow.com/questions/61415677
复制相似问题