【发布时间】:2011-03-26 17:53:36
【问题描述】:
是否可以存储对类实例的引用?
class Node
{
public int id;
public int value;
public List<Node> neighbours;
}
如何填充neighbours 列表,以便我对Node 实例所做的任何更改都会反映在该列表中?
【问题讨论】:
是否可以存储对类实例的引用?
class Node
{
public int id;
public int value;
public List<Node> neighbours;
}
如何填充neighbours 列表,以便我对Node 实例所做的任何更改都会反映在该列表中?
【问题讨论】:
public List<Node> neighbours;
由于您的 Node 类是引用类型,所有 Node 类型的变量将仅包含 references(就像指针一样)指向内存中的 Node 对象 - 所以邻居列表包含对您的Node 对象的引用列表 - 对这些对象的任何更改都将反映在列表中,因为它们指向您修改的对象。
另见Value Types and Reference Types:
一个数据类型是一个值类型,如果它 将数据保存在自己的内存中 分配。引用类型包含 指向另一个内存位置的指针 保存数据。
编辑以解决评论:
如前所述,您的Node 类是引用类型,所有类类型都是。我再次引用MSDN:
结构可能看起来类似于类, 但有重要的区别 你应该知道的。首先 所有,类都是引用类型和 结构是值类型。通过使用 结构,您可以创建对象 表现得像内置类型和 享受他们的好处。
现在这对你意味着什么? struct 类型的大小是其成员的组合大小,它不指向内存地址,这与 class 类型不同。使用struct 将改变您的类型行为的语义——如果您将一个结构实例分配给另一个相同类型的结构实例(对于任何其他值类型相同),struct 中的所有值都将从一个复制到另一个, 你仍然有两个独立的对象实例。 - 另一方面,对于引用类型,两者之后都会指向同一个对象。
示例节点是class:
Node node1 = new Node() { id = 1, value = 42};
Node node2 = node1;
node2.value = 55;
Console.WriteLine(node1.value); //prints 55, both point to same,modified object
示例节点是struct:
Node node1 = new Node() { id = 1, value = 42};
Node node2 = node1;
node2.value = 55;
Console.WriteLine(node1.value); //prints 42, separate objects
【讨论】:
class 创建一个引用类型,而struct 创建一个值类型。指出这种差异可能是特别的。对于来自 C++ 的人来说很有用,因为 class/struct 之间的区别在那里是不同的,而且这些关键字在 C# 中的全部含义对他们来说可能并不明显。
如果你有
Node node = new Node{Id =1, Value = 1};
node.neighbours = new List<Node>();
Node neighbourNode = new Node{Id =1, Value = 1};
node.neighbours.Add(neighbourNode);
您可以在将neighbourNode 添加到node 后更改它,并且由于您正在存储引用,它将反映在列表的项目中。
【讨论】: