首先,我想说明我已经遍历了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<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
我相信我确实在每个循环上实例化了新对象,所以不确定当列表本身在循环外声明时,为什么列表的先前值会被覆盖。任何帮助将不胜感激。
答案 0 :(得分:2)
尝试更换
var PenIsland = new MessageVM(byte_mes, message_id);
使用
var PenIsland = new MessageVM(new List<byte>(byte_mes), message_id);
这为每个MessageVM
对象分配了自己的List<byte>
实例。