指向C#中的类实例的指针

时间:2011-03-26 17:53:36

标签: c# pointers

是否可以将引用存储到类实例中?

class Node
{
    public int id;
    public int value;
    public List<Node> neighbours;
}

如何填充列表neighbours,以便我对Node实例所做的任何更改都会反映在那里?

2 个答案:

答案 0 :(得分:17)

public List<Node> neighbours;

由于您的Node类是引用类型,因此Node类型的所有变量只包含引用(就像指针一样)到Node对象中内存 - 所以邻居列表包含<{>>对象的列表 - 对这些对象的任何更改都将反映在列表中,因为它们指向您修改的对象。 / p>

另见Value Types and Reference Types

  

数据类型是值类型   将数据保存在自己的内存中   分配。引用类型包含   指向另一个内存位置的指针   保存数据。

修改以发表评论:

如前所述,Node类是引用类型,所有类类型都是。我再次引用MSDN

  

结构似乎与类相似,   但是有重要的区别   你应该知道的。首先   所有,类都是引用类型和   结构是值类型。通过使用   结构,你可以创建对象   表现得像内置类型和   也享受他们的好处。

现在这对你意味着什么? Node类型的大小是其成员的组合大小,与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

答案 1 :(得分:2)

如果你有

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之后更改{{1}},并且由于您要存储参考,它将反映在列表的项目中。