C# 这个.Enqueue() 使用“临时”对象数据排队时的奇怪行为
本文关键字:排队 数据 对象 Enqueue 这个 使用 临时 | 更新日期: 2023-09-27 17:56:18
我遇到了这种行为。 考虑此代码
classQtData temp_data = new classData(); //consider this...
public int AddData(ref classSerialPort serial_com )
{
int return_number_of_packet_read;
int index_a;
return_number_of_packet_read = 0;
while (serial_com.GetRawData(ref raw_vector) > 0)
{
//assign temp__data stuffs....
temp_data.rolling_counter = (uint)raw_vector[40];
this.Enqueue(temp_data);
return_number_of_packet_read++;
}
return return_number_of_packet_read;
}
在这种情况下,如果 while 循环执行(例如)3 次,则相同的temp_data
对象(最后一次插入)将排队 3 次,而不是插入 3 个不同的对象。
否则,此代码片段将按我的预期工作,对正确的元素进行排队:
public int AddData(ref classSerialPort serial_com )
{
int return_number_of_packet_read;
int index_a;
return_number_of_packet_read = 0;
while (serial_com.GetRawData(ref raw_vector) > 0)
{
classQtData temp_data = new classData();
//assign temp__data stuffs....
temp_data.rolling_counter = (uint)raw_vector[40];
this.Enqueue(temp_data);
return_number_of_packet_read++;
}
return return_number_of_packet_read;
}
是的,那是因为您向同一对象添加了三个相同的引用。在您的第一个示例中只有一个classData
,因此多次看到同一对象也就不足为奇了。基本上,第一个示例是完全错误的,第二个是正确的:在第二个示例中,每次迭代创建一个不同的对象。
temp_data
的值只是对位于其他地方的对象的引用。当您Enqueue(temp_data)
时,您只是将引用的副本添加到队列中 - 而不是对象的副本。用人类的话来说,这就像复制一个街道地址:你复制多少个街道地址并不重要:它们都指的是一栋建筑。