C#this.Enqueue()使用"temp"对象数据进行排队时的奇怪行为

gra*_*ori 1 .net c# oop

我正在经历这种行为.考虑这段代码

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)

Mar*_*ell 6

是的,这是因为您已向同一对象添加了三个相同的引用.classData在您的第一个示例中只有一个,因此您多次看到同一个对象并不奇怪.基本上,第一个例子是错误的,第二个例子是正确的:在第二个例子中,每次迭代创建一个不同的对象.

temp_data只是对生活在其他地方的对象的引用.当你Enqueue(temp_data),你只是添加对队列的引用的副本 - 而不是对象的副本.从人的角度来说,就像复制一个街道地址一样:你所制作的街道地址的副本数无关紧要:它们都是指单一的建筑物.