เมธอด Queue.Clone() ใน C# ใช้สร้าง shallow copy (สำเนาลึกตื้น) ของ Queue — ออบเจ็กต์ Queue ใหม่ที่มีสมาชิกอ้างอิงไปยังอ็อบเจ็กต์เดิมๆ
ไวยากรณ์ (Syntax)
public virtual object Clone();
- คืนค่า
object— ต้อง cast เป็นQueue(non-generic) หรือQueue<T>(generic) - เป็น shallow copy — สมาชิกที่เป็น reference type จะชี้ไปยังอ็อบเจ็กต์เดิม (ไม่ได้ clone ลึก)
ตัวอย่างที่ 1: Clone 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...");
foreach (string str in queue)
{
Console.WriteLine(str);
}
Queue queue2 = (Queue)queue.Clone();
Console.WriteLine("\nCloned Queue....");
foreach (string str in queue2)
{
Console.WriteLine(str);
}
}
}
ผลลัพธ์
Queue... One Two Three Four Five Six Seven Eight Cloned Queue.... One Two Three Four Five Six Seven Eight
ตัวอย่างที่ 2: Clone Queue จำนวนเต็ม (non-generic)
using System;
using System.Collections;
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...");
foreach (int val in queue)
{
Console.WriteLine(val);
}
Queue queue2 = (Queue)queue.Clone();
Console.WriteLine("\nCloned Queue....");
foreach (int val in queue2)
{
Console.WriteLine(val);
}
}
}
ผลลัพธ์
Queue... 10 20 30 40 50 Cloned Queue.... 10 20 30 40 50
สรุป
Clone()สร้าง Queue ใหม่ที่มีสมาชิกเท่ากับต้นทาง — shallow copy- สำหรับ value types (int, struct) — ค่าถูกคัดลอก (independent)
- สำหรับ reference types (string, class, array) — reference ถูกคัดลอก (ชี้ไปยังอ็อบเจ็กต์เดิม)
- Non-generic
Queue(System.Collections) ล้าสแล้ว — ควรใช้Queue<T>แทน - Generic
Queue<T>ไม่มีเมธอดClone()— หากต้อง copy ให้ใช้ constructor:new Queue<T>(existingQueue)
วิธี Copy Queue<T> แบบ Generic (แนะนำ)
using System;
using System.Collections.Generic;
var original = new Queue<string>();
original.Enqueue("A");
original.Enqueue("B");
original.Enqueue("C");
// Copy constructor - สร้าง Queue ใหม่จากคิวเดิม (shallow copy)
var copy = new Queue<string>(original);
Console.WriteLine("Original count: " + original.Count); // 3
Console.WriteLine("Copy count: " + copy.Count); // 3
// แก้ไข copy ไม่ส่งผลต่อ original (ถ้าเป็น value type หรือ string - immutable)
copy.Dequeue();
Console.WriteLine("After dequeue copy: original=" + original.Count + ", copy=" + copy.Count); // 3, 2
Shallow vs Deep Copy
| ประเภท | Shallow Copy | Deep Copy |
|---|---|---|
| Value types (int, bool, struct) | คัดลอกค่า (อิสระ) | คัดลอกค่า (อิสระ) |
| Reference types (class, string, array) | คัดลอกรีเฟอเรนซ์ (ชี้ตัวเดียวกัน) | สร้างอ็อบเจ็กต์ใหม่ คัดลอกค่าทุกฟิลด์ |
| String (immutable) | ปลอดภัย — ไม่สามารถแก้ไขได้ | ไม่จำเป็น |