【问题标题】:Why is a value in a C# Linked List changing when I create a new object?为什么创建新对象时 C# 链表中的值会发生变化?
【发布时间】:2017-03-20 03:35:49
【问题描述】:

我正在使用的对象有两个值,一个对象编号和一个名称字符串; 该对象有一个构造函数,该构造函数在创建新对象时自动递增值,因此每个对象都有一个唯一编号。

public class MyObject
{
    private static int _objectnumber;
    private string _name; 

     public MyObject()
     {
         ++_objectNumber;
     }
}

我创建一个新对象并将其分配给一个变量。

curObject = new MyObject();

从用户那里得到名字后,我把它插入到一个链表中。

if(myLinkedList == null)
{
    myLinkedList = new LinkedList<MyObject>();
    myLinkedList.AddFirst(curObject);
 }
else
{
    // code here to check to make sure the objectnumber is unique

     myLinkedList.AddLast(curObject);         
 }
curObject = null;    //I'm done with this

当我创建第二个新对象时会出现问题。当我打电话时...

 curObject = new MyObject();

...第二次。构造函数应该增加对象编号,但它也会增加链表第一个节点中的对象编号。

就好像 curObject 仍然指向列表中的第一个节点(这就是为什么我将它放入列表后将其设置为 null。

最初,链表中的 name 字段也会发生变化,但通过将 curObject 设置为 null 来解决这个问题。

显然,当我将 curObject 插入链表时,链表节点只是指向存储 curObject 的内存。但是,当我创建一个新的 curObject 时,它似乎只是将新对象设置为相同的内存空间 - 因此,它也指向链表的第一个节点。

【问题讨论】:

  • 我看到只有一个 _objectnumber 声明。每个实例没有一个。它是静态的,所以整个过程只有一个。
  • 链接列表似乎完全是这个问题的红鲱鱼。如果您只有两个包含两个实例的变量,您将看到完全相同的行为。如果你也在c 中实现了,你会看到几乎相同的问题。
  • 是的,链接列表完全是一条红鲱鱼。我更改为 Lists 并得到相同的行为。问题是我将变量声明为静态变量。在设计的同时进行编码,并在早期实施中绊倒,这与最初的想法并不完全一致。

标签: c# .net list linked-list


【解决方案1】:

正如@Damien 所说,您的问题与链表无关。

您已将_objectnumber 定义为类的静态,即该类的所有实例只有一个副本。

相反,创建一个私有成员并从静态变量分配:

public class MyObject
{
    private static int Objectnumber = 0;

    private int _objectnumber;
    private string _name; 

    public MyObject()
    {
        _objectNumber = ++Objectnumber;
    }
}

【讨论】:

  • 谢谢大家。这就是问题所在。一个初步的实施想法,但事实证明并没有达到预期的效果。
猜你喜欢
  • 2013-07-03
  • 2021-02-24
  • 2014-09-29
  • 2013-10-13
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多