【问题标题】:Adding object to a list causes overwriting of all previous values, despite new instantiation within loop将对象添加到列表会导致覆盖所有以前的值,尽管在循环中进行了新的实例化
【发布时间】:2019-04-11 01:41:32
【问题描述】:

首先,我想说的是,我已经查看了 StackOverflow 上的所有其他类似问题,例如 this、this 和 this,这可能会使这个问题看起来像重复。

在这些问题中,问题似乎是每次都覆盖同一个实例,解决方法是在循环中实例化新对象。其他错误是不正确的静态声明。这些补救措施对我不起作用。

这是片段的一些背景代码,让我很头疼。

    // list of bytes of messages parsed from RS232 feed from a single frame
    List<byte> byte_mes = new List<byte>();

    // list of parsed messeges
    List<MessageVM> Messages = new List<MessageVM>();

在填充了byte_mes 的一些额外逻辑之后。
这是将MessageVM 的实例添加到List&lt;MessageVM&gt; Messages 的代码。

for(loop) {

    Console.WriteLine("Received: " + BA2HexStr(byte_mes));
    Console.WriteLine("----------------------------------------");

    // new instance with current parameters
    var PenIsland= new MessageVM(byte_mes, message_id);

    // add new instance to the listt
    Messages.Add(PenIsland);

    Console.WriteLine("Messages vector size = " + Messages.Count);

    int o = 0;
    foreach(MessageVM m in Messages) {
        Console.WriteLine("Payload in Messages[{0}] {1} " ,o, BA2HexStr(m.PayLoad));                            
        o++;
    }

    // clears messages that were just uploaded
    byte_mes.Clear();                        
} 

最初我尝试了这段代码Messages.Add(new MessageVM(byte_mes, message_id));,但结果相同,因此决定更详细。

这是我在执行后从控制台输出收到的打印输出。
除了第一个字节中的计数器之外,消息都是相同的。 它成功加载每条消息,并按预期添加第一条消息。
在随后的迭代中,List&lt;MessageVM&gt; Messages 的大小会增长,但现在它持有的每个值都被最新到达的值替换。

Received: 30-02-28-88-88-88-88-88-88-88-88
----------------------------------------
Messages vector size = 1
Payload in Messages [0] 30-02-28-88-88-88-88-88-88-88-88 

Received: 31-02-28-88-88-88-88-88-88-88-88
----------------------------------------
Messages vector size = 2
Payload in Messages [0] 31-02-28-88-88-88-88-88-88-88-88 
Payload in Messages [1] 31-02-28-88-88-88-88-88-88-88-88 

Received: 32-02-28-88-88-88-88-88-88-88-88
----------------------------------------
Messages vector size = 3
Payload in Messages [0] 32-02-28-88-88-88-88-88-88-88-88 
Payload in Messages [1] 32-02-28-88-88-88-88-88-88-88-88 
Payload in Messages [2] 32-02-28-88-88-88-88-88-88-88-88 

Received: 33-02-28-88-88-88-88-88-88-88-88
----------------------------------------
Messages vector size = 4
Payload in Messages [0] 33-02-28-88-88-88-88-88-88-88-88 
Payload in Messages [1] 33-02-28-88-88-88-88-88-88-88-88 
Payload in Messages [2] 33-02-28-88-88-88-88-88-88-88-88 
Payload in Messages [3] 33-02-28-88-88-88-88-88-88-88-88 

Received: 34-02-28-88-88-88-88-88-88-88-88
----------------------------------------
Messages vector size = 5
Payload in Messages [0] 34-02-28-88-88-88-88-88-88-88-88 
Payload in Messages [1] 34-02-28-88-88-88-88-88-88-88-88 
Payload in Messages [2] 34-02-28-88-88-88-88-88-88-88-88 
Payload in Messages [3] 34-02-28-88-88-88-88-88-88-88-88 
Payload in Messages [4] 34-02-28-88-88-88-88-88-88-88-88 

我相信我确实在每个循环上都实例化了新对象,所以不确定为什么 List 的先前值会被覆盖,而 List 本身是在循环之外声明的。任何帮助将不胜感激。

【问题讨论】:

  • 您每次都创建一个新的MessageVM 对象,是的,但是所有m.PayLoad 都引用同一个List&lt;byte&gt; byte_mes 实例。 byte_mes 正在修改为新值,以便解释您获得的结果。
  • 好吧,这是有道理的。现在我看到他们都引用同一个实例,因此当我改变时改变了。那是一个巨大的忽视。谢谢。

标签: c# arrays list object


【解决方案1】:

尝试替换

var PenIsland = new MessageVM(byte_mes, message_id);

与

var PenIsland = new MessageVM(new List<byte>(byte_mes), message_id);

这会为每个MessageVM 对象分配其自己的List&lt;byte&gt; 实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 2016-11-14
    • 2019-01-18
    • 2023-03-15
    相关资源
    最近更新 更多