C# Queue

本文详细阐述了在C#程序中使用Queue数据结构时遇到对象引用问题的原因及解决方法,通过使用Clone()函数实现对象的深复制,确保Queue中存储的数据不会因引用相同而导致丢失或覆盖原始信息,适用于需要记录并按顺序回放数据的应用场景。

    我今天在为俄罗斯方块的录像功能准备程序时,遇到一个技术难题。后来通过一个同学的提点使用clone()函数,再经过自己网上查找资料,把这个问题解决了。下面我就详细把这个问题和解决方案记录下,一方面是技术积累,一方面也方便有其他人遇到类似的问题。

    问题描述:

    C#为程序开发人员提供了一个Queue<T>的FIFO的模板,这个数据结构对于记录数据,然后又需要将数据按读入的顺序读出提供了很大的便利。今天我想用这个Queue为自己的程序依次记录下每个俄罗斯方块的每一时刻的位置和形状信息,然后以便于自己再依次读取这些信息,这样我就可以将俄罗斯方块Game的过程像录像一样回放。我在使用这个Queue时,自定义了一个Node class 作为T的type。每隔一定的时刻就将窗口中方块的信息Enqueue(进对),等到要回放时在Dequeue(出队),这时问题出现了,每次出队的Node信息居然是一样的,但是我的进队的Node信息确实是不同的。经过调试和思索后,我觉得问题的原因在于:

    问题原因:

    每次进队的Node的地址是一样的,虽然Node的具体内容不同,也就是说,我每次进队的都是同一个地址的Node,这样之前进队的Node信息也被新的信息刷新了,这样整个Queue中都是同样的Node。所以出队时,自然都是一样的Node。后来问题的解决方案是:

    问题解决方案:

    使用Clone()函数,一个简单的示例:

        public object Clone()

        {

            //return this as object;//不复制,引用同一个对象,对一个对象的改变会影响另外一个。

             return this.MemberwiseClone(); //浅复制

            //return new Person(this.name, this.age) as object;//深复制,在这因为person中没有其他的引用对象,所有效果和浅复制效             果一样

        }

   Clone()的具体用法,可以在百度或是Google上找答案。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值