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

ความแตกต่างระหว่าง String.Copy() และ String.Clone() ใน C#

String.Copy() - สร้างอ็อบเจ็กต์ String ใหม่

สร้างอินสแตนซ์ String ใหม่ที่มีเนื้อหาเหมือน String ต้นทาง สมบูรณ์แบบทุกอย่าง

ตัวอย่าง String.Copy()

using System;

class Demo {
    static void Main(String[] args) {
        string str1 = "mark";
        string str2 = "marcus";
        
        Console.WriteLine("str1 = '{0}'", str1);
        Console.WriteLine("str2 = '{0}'", str2);
        Console.WriteLine("After using String.Copy...");
        
        str2 = String.Copy(str1);
        
        Console.WriteLine("str1 = '{0}'", str1);
        Console.WriteLine("str2 = '{0}'", str2);
    }
}

ผลลัพธ์

str1 = 'mark'
str2 = 'marcus'
After using String.Copy...
str1 = 'mark'
str2 = 'mark'

String.Clone() - คืนค่าอ้างอิงไปยังอินสแตนซ์เดิม

คืนค่าอ้างอิง (Reference) ไปยังอินสแตนซ์ String เดียวกัน ไม่สร้างอ็อบเจ็กต์ใหม่ เนื่องจาก String เป็น Immutable จึงปลอดภัยที่จะแชร์อ็อบเจ็กต์เดียวกัน

ตัวอย่าง String.Clone()

using System;

class Demo {
    static void Main(String[] args) {
        string str1 = "amy";
        string str2 = "emma";
        
        Console.WriteLine("str1 = '{0}'", str1);
        Console.WriteLine("str2 = '{0}'", str2);
        Console.WriteLine("After using String.Clone...");
        
        str2 = (String)str1.Clone();
        
        Console.WriteLine("str1 = '{0}'", str1);
        Console.WriteLine("str2 = '{0}'", str2);
    }
}

ผลลัพธ์

str1 = 'amy'
str2 = 'emma'
After using String.Clone...
str1 = 'amy'
str2 = 'amy'

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

คุณสมบัติ String.Copy() String.Clone()
การสร้างอ็อบเจ็กต์ สร้างอ็อบเจ็กต์ใหม่ (New Instance) คืนอ้างอิงอ็อบเจ็กต์เดิม (Same Reference)
หน่วยความจำ จัดสรรใหม่ ไม่จัดสรรใหม่ (Shared)
คืนค่า string object (ต้อง Cast)
ความปลอดภัย ปลอดภัยเสมอ (Independent) ปลอดภัยเพราะ String เป็น Immutable
ประสิทธิภาพ ช้ากว่า (Allocate ใหม่) เร็วกว่า (No Allocation)

ข้อสังเกตสำคัญ

เนื่องจาก String ใน C# เป็น Immutable ทั้ง Copy() และ Clone() จึงให้ผลลัพธ์ที่เหมือนกันในทางปฏิบัติ (ค่าของ String ไม่สามารถเปลี่ยนแปลงได้หลังสร้าง) ความแตกต่างจริงอยู่ที่การจัดการหน่วยความจำและประสิทธิภาพ

แนวทางการเลือกใช้งาน

  • ใช้ String.Copy() เมื่อต้องการความชัดเจนว่าเป็นอ็อบเจ็กต์ใหม่ (Semantic Clarity)
  • ใช้ String.Clone() เมื่อทำงานกับ Interface ICloneable แบบ Generic
  • ในทางปฏิบัติส่วนใหญ่ string newStr = oldStr; ก็เพียงพอแล้ว (เพราะ Immutable)