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

System.Array.CopyTo() เทียบ System.Array.Clone() ใน C#

Array.CopyTo() - คัดลอกข้อมูลไปยัง Array อื่น

คัดลอกสมาชิกทั้งหมดของ Array แบบ 1 มิติ ไปยัง Array ปลายทาง ตั้งแต่ Index ที่ระบุ

Syntax

public void CopyTo(Array array, int index)

ตัวอย่าง CopyTo()

using System;

class Program {
    static void Main() {
        int[] arrSource = { 5, 9, 1, 3 };
        int[] arrTarget = new int[4];
        
        // คัดลอกทั้งหมดไปยัง Index 0 ของ Target
        arrSource.CopyTo(arrTarget, 0);
        
        Console.WriteLine("Destination Array:");
        foreach (int value in arrTarget) {
            Console.WriteLine(value);
        }
    }
}

ผลลัพธ์

Destination Array:
5
9
1
3

Array.Clone() - สร้าง Shallow Copy ของ Array

สร้าง Array ใหม่ที่มีสมาชิกเหมือนกันทุกตัว (Shallow Copy - Reference Types จะอ้างอิง Object เดิม)

Syntax

public object Clone()

ตัวอย่าง Clone()

using System;

class Program {
    static void Main() {
        string[] arr = { "one", "two", "three", "four", "five" };
        
        // Clone ต้อง Cast กลับมาที่ Type เดิม
        string[] arrCloned = arr.Clone() as string[];
        
        Console.WriteLine("Original: " + string.Join(",", arr));
        Console.WriteLine("Cloned:   " + string.Join(",", arrCloned));
        
        // ทดสอบว่าเป็น Object เดียวกันหรือไม่ (Reference Type)
        arr[0] = "CHANGED";
        Console.WriteLine("\nAfter changing arr[0]:");
        Console.WriteLine("Original: " + string.Join(",", arr));
        Console.WriteLine("Cloned:   " + string.Join(",", arrCloned));
    }
}

ผลลัพธ์

Original: one,two,three,four,five
Cloned:   one,two,three,four,five

After changing arr[0]:
Original: CHANGED,two,three,four,five
Cloned:   CHANGED,two,three,four,five  ← เปลี่ยนด้วย! (Shallow Copy)

ตารางเปรียบเทียบสรุป

คุณสมบัติ Array.CopyTo() Array.Clone()
วัตถุประสงค์ คัดลอกข้อมูลไป Array ที่มีอยู่แล้ว สร้าง Array ใหม่ที่เหมือนกัน
คืนค่า void object (ต้อง Cast)
Array ปลายทาง ต้องสร้างไว้ก่อน สร้างใหม่อัตโนมัติ
ขนาด Array ปลายทาง ต้องพอหรือใหญ่กว่า เท่ากับต้นทางเสมอ
ประเภทการคัดลอก Shallow Copy Shallow Copy
คัดลอกบางส่วนได้ไหม ได้ (ระบุ Index) ไม่ได้ (คัดลอกทั้ง Array)
หลายมิติ (Multi-dim) ไม่ได้ (1D เท่านั้น) ได้ (รักษา Rank/Dimensions)

Deep Copy สำหรับ Reference Types

ถ้าต้องการ Deep Copy (คัดลอก Object จริง ไม่ใช่ Reference):

// Manual Deep Copy
string[] deepCopy = new string[arr.Length];
for (int i = 0; i < arr.Length; i++) {
    deepCopy[i] = string.Copy(arr[i]); // String เป็น Immutable จึง Copy ได้
}

// หรือใช้ LINQ
string[] deepCopy = arr.Select(s => string.Copy(s)).ToArray();

// สำหรับ Object แบบ Custom - ต้อง Implement ICloneable หรือ Copy Constructor

Array.Copy() Static Method (ทางเลือกอื่น)

// คัดลอกบางส่วน ระบุ Source Index, Dest Index, Length
Array.Copy(sourceArray, 0, destArray, 2, 3); // คัดลอก 3 ตัวจากต้นทาง[0] ไปปลายทาง[2]