C# 将对象添加到列表会导致覆盖所有以前的值,尽管循环中有新的实例化
首先,我想声明,我已经复习了StackOverflow上的所有其他类似问题,例如,和,这可能会使这个问题看起来像是重复的 在这些问题中,问题似乎是每次都覆盖同一个实例,解决方法是在循环中实例化新对象。另一个错误是静态声明不正确。那些药方对我不起作用 这是一段让我头疼的片段的背景代码C# 将对象添加到列表会导致覆盖所有以前的值,尽管循环中有新的实例化,c#,arrays,list,object,C#,Arrays,List,Object,首先,我想声明,我已经复习了StackOverflow上的所有其他类似问题,例如,和,这可能会使这个问题看起来像是重复的 在这些问题中,问题似乎是每次都覆盖同一个实例,解决方法是在循环中实例化新对象。另一个错误是静态声明不正确。那些药方对我不起作用 这是一段让我头疼的片段的背景代码 // list of bytes of messages parsed from RS232 feed from a single frame List<byte> byte_mes =
// 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>();
最初我尝试了这个代码Messages.Add(newmessagevm(byte_mes,message_id))代码>,但结果相同,因此决定更加详细
这是我在执行后从控制台输出接收的优先级。
除了第一个字节中的计数器外,所有消息都是相同的。
它成功加载每条消息,并按预期添加第一条消息。
在随后的迭代中,列表消息的大小会增加,但现在它所持有的每个值都会被最新到达的值所取代
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
我相信我确实在每个循环上实例化了新对象,所以不确定为什么列表的先前值会被覆盖,而列表本身在循环之外声明。任何帮助都将不胜感激。尝试替换
var PenIsland = new MessageVM(byte_mes, message_id);
与
var PenIsland=newmessagevm(新列表(字节),消息id);
这将为每个MessageVM
对象分配其自己的List
实例。您每次都创建一个新的MessageVM
对象,是的,但所有m.PayLoad
引用相同的List byte\u mes
实例byte_mes
将被修改为新值,因此可以解释您得到的结果。好的,这是有意义的。现在我看到它们都指向同一个实例,因此在我更改时发生了更改。那是一个巨大的疏忽。非常感谢。
var PenIsland = new MessageVM(byte_mes, message_id);
var PenIsland = new MessageVM(new List<byte>(byte_mes), message_id);