【问题标题】:Pointer to a class instance in C#指向 C# 中的类实例的指针
【发布时间】:2011-03-26 17:53:36
【问题描述】:

是否可以存储对类实例的引用?

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

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

【问题讨论】:

    标签: c# pointers


    【解决方案1】:
    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
    

    【讨论】:

    • +1。这个原本不错的答案中缺少一个细节:我认为最好指出class 创建一个引用类型,而struct 创建一个值类型。指出这种差异可能是特别的。对于来自 C++ 的人来说很有用,因为 class/struct 之间的区别在那里是不同的,而且这些关键字在 C# 中的全部含义对他们来说可能并不明显。
    【解决方案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 后更改它,并且由于您正在存储引用,它将反映在列表的项目中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      相关资源
      最近更新 更多