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)