Queueにクラスを挿入後うまく取り出せない時の対処

Queueに変更を反映する操作を追加します。

QueueにクラスをEnqueueから追加する処理を行った後、Dequeueから取り出す処理を実行した際に最後に追加したクラスが取り出される場合の対処です。

失敗例

using System.Collections.Generic;
using UnityEngine;
namespace BlueBreath.Practice
{
    public class DemoComponent : MonoBehaviour
    {
        Queue<DemoLog> demologs = new Queue<DemoLog>();
        DemoLog demolog = new DemoLog(); 
        private void Start()
        {
            demolog.Log = "Demo1";
            demologs.Enqueue(demolog);

            demolog.Log = "Demo2";
            demologs.Enqueue(demolog);

            demolog.Log = "Demo3";
            demologs.Enqueue(demolog);
        }
        private void Update() {
            if(demologs.Count > 0)
                Debug.Log(demologs.Dequeue().Log);    
        }
    }
    public class DemoLog
    {
        public string Log = "";
    }
}

最後に変更されたdemologが3回挿入され、取り出されています。

修正

using System.Collections.Generic;
using UnityEngine;
namespace BlueBreath.Practice
{
    public class DemoComponent : MonoBehaviour
    {
        Queue<DemoLog> demologs = new Queue<DemoLog>();
        DemoLog demolog = new DemoLog(); 
        private void Start()
        {
            demolog.Log = "Demo1";
            demologs.Enqueue(demolog);
            demolog = new DemoLog();

            demolog.Log = "Demo2";
            demologs.Enqueue(demolog);
            demolog = new DemoLog();

            demolog.Log = "Demo3";
            demologs.Enqueue(demolog);
            demolog = new DemoLog();

        }
        private void Update() {
            if(demologs.Count > 0){
                Debug.Log(demologs.Dequeue().Log);    
            }
        }
    }
    public class DemoLog
    {
        public string Log = "";
    }
}

クラスをQueueに追加直後、Queueを更新する為にクラスをnewで初期化します。Dequeueにより実行される前にEnqueueが実行されます。

原因

Dequeueから取り出す処理には、「クラス”demolog”を取り出す」という処理が3回登録されていたため。新たにクラスインスタンスを生成してQueueに登録する必要があった。

参考

Queue<T>.Enqueue(T) メソッド

コメント

タイトルとURLをコピーしました