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

标签 c# .net 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;
}

在这种情况下,如果 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/

相关文章:

c# - 通过 IList 后门通用列表

c# - 当所有当前计划的任务完成时,将任务排队执行 - 没有对任务的引用

c# - 如何避免无限循环,最佳实践

c# - 接口(interface)的通用类型约束?

.net - GKE 中的 dotnet 应用程序与 nginx 入口 Controller 和代理

java - 重写父类(super class)的方法。不明确的引用编译时错误

c# - 如何在 Xamarin Forms 中启用工具栏

c# - 当 child 发生变化时更新 parent

java - 工厂设计模式和Diamond OOP问题

Javascript - 指点击时运行的函数中的 "this"