【发布时间】: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<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
我相信我确实在每个循环上都实例化了新对象,所以不确定为什么 List 的先前值会被覆盖,而 List 本身是在循环之外声明的。任何帮助将不胜感激。
【问题讨论】:
-
您每次都创建一个新的
MessageVM对象,是的,但是所有m.PayLoad都引用同一个List<byte> byte_mes实例。byte_mes正在修改为新值,以便解释您获得的结果。 -
好吧,这是有道理的。现在我看到他们都引用同一个实例,因此当我改变时改变了。那是一个巨大的忽视。谢谢。