Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

เมธอด Queue.Clone() ใน C#

เมธอด 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 CopyDeep Copy
Value types (int, bool, struct)คัดลอกค่า (อิสระ)คัดลอกค่า (อิสระ)
Reference types (class, string, array)คัดลอกรีเฟอเรนซ์ (ชี้ตัวเดียวกัน)สร้างอ็อบเจ็กต์ใหม่ คัดลอกค่าทุกฟิลด์
String (immutable)ปลอดภัย — ไม่สามารถแก้ไขได้ไม่จำเป็น