Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Phương thức Queue.Clone() trong C#

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 Queue Clone(); // 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 Queue có Clone() từ lâu. Generic Queue<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ó.