我遇到了这种行为。考虑这段代码
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)
时,您只是将 reference 的副本添加到队列中 - 而不是对象的副本。用人类的话说,这就像复制街道地址:复制多少份街道地址并不重要:它们都指的是同一栋建筑物。
关于C# this.Enqueue() 使用 "temp"对象数据入队时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22835196/