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;
}

C# 这个.Enqueue() 使用“临时”对象数据排队时的奇怪行为

是的,那是因为您向同一对象添加了三个相同的引用。在您的第一个示例中只有一个classData,因此多次看到同一对象也就不足为奇了。基本上,第一个示例是完全错误的,第二个是正确的:在第二个示例中,每次迭代创建一个不同的对象。

temp_data的值只是对位于其他地方的对象的引用。当您Enqueue(temp_data)时,您只是将引用的副本添加到队列中 - 而不是对象的副本。用人类的话来说,这就像复制一个街道地址:你复制多少个街道地址并不重要:它们都指的是一栋建筑。