为什么在创建新对象时,C#链表中的值会发生变化?

为什么在创建新对象时,C#链表中的值会发生变化?,c#,.net,list,linked-list,C#,.net,List,Linked List,我使用的对象有两个值,一个对象编号和一个名称字符串; 该对象有一个构造函数,每当创建一个新对象时,该构造函数会自动递增该值,因此每个对象都有一个唯一的编号 public class MyObject { private static int _objectnumber; private string _name; public MyObject() { ++_objectNumber; } } 我创建一个新对象并将其分配给一个

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

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仍然指向列表中的第一个节点(这就是为什么我在将其放入列表后将其设置为null)

最初,链接列表中的“名称”字段也会更改,但通过将curObject设置为null,这一点得到了修复


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

正如@Damien所评论的,您的问题已经解决与链接列表无关

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
您已将
\u objectnumber
定义为该类的静态,即该类的所有实例只有一个副本

而是创建一个私有成员并从静态变量赋值:

public class MyObject
{
    private static int Objectnumber = 0;

    private int _objectnumber;
    private string _name; 

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

正如@Damien所评论的,你的问题与链表无关

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
您已将
\u objectnumber
定义为该类的静态,即该类的所有实例只有一个副本

而是创建一个私有成员并从静态变量赋值:

public class MyObject
{
    private static int Objectnumber = 0;

    private int _objectnumber;
    private string _name; 

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

我看到声明了一个
\u objectnumber
。不是每个实例都有一个。它是静态的,所以整个过程只有一个。在这个问题上,链表似乎完全是一个转移视线的问题。如果只有两个变量包含两个实例,你会看到完全相同的行为。你会看到几乎相同的问题是的,链表是一个完全的骗局。我改成了链表,得到了同样的行为。问题是我将变量声明为静态变量。在设计和早期实现时出错的编码与最初的想法不太一致。只有一个
\u objectnumber
Iee声明。不是每个实例都有一个。它是静态的,所以整个过程只有一个。在这个问题上,链表似乎完全是一条红鲱鱼。如果你只有两个变量包含两个实例,你会看到完全相同的行为。如果你在中实现它,你会看到几乎相同的问题。是的,链表列表完全是一个骗局。我改成了列表,得到了相同的行为。问题是,我将变量声明为静态。在设计时进行编码,并在早期实现时遇到了与原始想法不太一致的问题。谢谢大家。这就是问题所在。最初的实现想法被证明不是一个有效的方法我猜到了。谢谢大家。这就是问题所在。一个最初的实施想法被证明并没有如预期的那样奏效。