我正在经历这种行为.考虑这段代码
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;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果while循环执行(比如说)3次,则同一个temp_data对象(最后插入的)将被排队三次,而不是插入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;
}
Run Code Online (Sandbox Code Playgroud)
是的,这是因为您已向同一对象添加了三个相同的引用.classData在您的第一个示例中只有一个,因此您多次看到同一个对象并不奇怪.基本上,第一个例子是错误的,第二个例子是正确的:在第二个例子中,每次迭代创建一个不同的对象.
值temp_data只是对生活在其他地方的对象的引用.当你Enqueue(temp_data),你只是添加对队列的引用的副本 - 而不是对象的副本.从人的角度来说,就像复制一个街道地址一样:你所制作的街道地址的副本数无关紧要:它们都是指单一的建筑物.
| 归档时间: |
|
| 查看次数: |
67 次 |
| 最近记录: |