尽管在循环中有新的实例化,但将对象添加到列表中会导致覆盖所有先前的值

时间:2018-11-07 15:32:26

标签: c# arrays list object

首先,我想说明我已经遍历了StackOverflow上的所有其他类似问题,例如thisthisthis,这些问题可能会显示为重复。

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

这是该片段的一些后台代码,使我头疼。

    // 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<MessageVM> 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<MessageVM> 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 

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

1 个答案:

答案 0 :(得分:2)

尝试更换

var PenIsland = new MessageVM(byte_mes, message_id);

使用

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

这为每个MessageVM对象分配了自己的List<byte>实例。