Giới thiệu
Phương thức Clone() của Queue (non-generic) hoặc Queue<T> tạo một bản sao nông (shallow copy) của hàng đợi. Bản sao chứa tham chiếu đến cùng các đối tượng phần tử (cho kiểu tham chiếu) hoặc bản sao giá trị (cho kiểu giá trị).
Cú pháp
public virtual object Clone(); // Non-generic Queue public QueueClone(); // Queue (từ .NET Core / .NET 5+)
Ví dụ 1 - Queue non-generic
using System;
using System.Collections;
public class Demo
{
public static void Main(string[] args)
{
Queue queue = new Queue();
queue.Enqueue("One");
queue.Enqueue("Two");
queue.Enqueue("Three");
queue.Enqueue("Four");
queue.Enqueue("Five");
queue.Enqueue("Six");
queue.Enqueue("Seven");
queue.Enqueue("Eight");
Console.WriteLine("Queue gốc...");
foreach (string str in queue)
{
Console.WriteLine(str);
}
Queue queue2 = (Queue)queue.Clone();
Console.WriteLine("\nQueue đã clone...");
foreach (string str in queue2)
{
Console.WriteLine(str);
}
}
}
Kết quả
Queue gốc... One Two Three Four Five Six Seven Eight Queue đã clone... One Two Three Four Five Six Seven Eight
Ví dụ 2 - Queue generic (int)
using System;
using System.Collections.Generic;
public class Demo
{
public static void Main(string[] args)
{
Queue queue = new Queue();
queue.Enqueue(10);
queue.Enqueue(20);
queue.Enqueue(30);
queue.Enqueue(40);
queue.Enqueue(50);
Console.WriteLine("Queue gốc...");
foreach (int val in queue)
{
Console.WriteLine(val);
}
// Queue.Clone() chỉ có từ .NET Core / .NET 5+
// Trên .NET Framework, Queue không có Clone()
Queue queue2 = new Queue(queue); // Constructor copy
Console.WriteLine("\nQueue đã copy (constructor)...");
foreach (int val in queue2)
{
Console.WriteLine(val);
}
}
}
Kết quả
Queue gốc... 10 20 30 40 50 Queue đã copy (constructor)... 10 20 30 40 50
Lưu ý quan trọng
- Shallow copy: Phần tử kiểu tham chiếu (class, string, array) được chia sẻ giữa queue gốc và clone. Thay đổi nội dung object sẽ ảnh hưởng cả hai.
- Kiểu giá trị (int, struct) được copy độc lập.
- Non-generic
QueuecóClone()từ lâu. GenericQueue<T>chỉ cóClone()từ .NET Core 2.0+ / .NET 5+. - Cách tương thích mọi phiên bản:
new Queue<T>(existingQueue)(constructor copy). - Clone không copy capacity, chỉ copy các phần tử hiện có.