เมธอด String.Copy() ใน C# ใช้สร้าง instance ใหม่ของ String ที่มีค่าเท่ากับสตริงที่ระบุ ทำให้ได้สตริงอิสระที่แก้ไขได้โดยไม่กระทบต้นฉบับ (แม้สตริงใน C# จะเป็น immutable แต่ Copy() ช่วยให้ชัดเจนว่าสร้าง object ใหม่)
รูปแบบไวยากรณ์ (Syntax)
public static string Copy(string s);
s คือสตริงที่ต้องการคัดลอก
ตัวอย่างที่ 1: คัดลอกสตริงที่ต่างกัน
using System;
public class Demo
{
public static void Main(string[] args)
{
string s1 = "Amy";
string s2 = "Katie";
string s3 = String.Copy(s2); // สร้างสำเนาของ s2
Console.WriteLine("String1 = " + s1);
Console.WriteLine("String2 = " + s2);
Console.WriteLine("Are both strings equal? = " + s1.Equals(s2));
Console.WriteLine("Are s2 and s3 equal? = " + s2.Equals(s3));
Console.WriteLine(string.CompareOrdinal(s1, s2)); // -10
Console.WriteLine(string.CompareOrdinal(s2, s3)); // 0
}
}
ผลลัพธ์
String1 = Amy String2 = Katie Are both the strings equal? = False Are both the strings equal? = True -10 0
ตัวอย่างที่ 2: คัดลอกสตริงที่เหมือนกัน แล้วเปลี่ยนค่าสำเนา
using System;
public class Demo
{
public static void Main(string[] args)
{
string s1 = "Gary";
string s2 = "Gary";
string s3 = String.Copy(s2);
Console.WriteLine("String1 = " + s1);
Console.WriteLine("String2 = " + s2);
Console.WriteLine("Is s1 and s2 equal? = " + s1.Equals(s2));
Console.WriteLine("Is s2 and s3 equal? = " + s2.Equals(s3));
// เปลี่ยนค่า s3 (สร้างสตริงใหม่ เนื่องจาก string เป็น immutable)
s3 = "Harry";
Console.WriteLine("Is s2 and s3 equal? = " + s2.Equals(s3));
}
}
ผลลัพธ์
String1 = Gary String2 = Gary Is s1 and s2 equal? = True Is s2 and s3 equal? = True Is s2 and s3 equal? = False
สรุปและข้อสังเกต
String.Copy()สร้าง object ใหม่ใน heap ที่มีค่าเหมือนต้นฉบับ- ใน C# สตริงเป็น immutable (ไม่สามารถเปลี่ยนค่าได้) การ "เปลี่ยนค่า" จริงๆ คือการสร้าง object ใหม่
- ส่วนใหญ่ไม่จำเป็นต้องใช้ Copy() เพราะการกำหนดค่า
s3 = s2ก็อ้างอิง object เดียวกันได้ (เพราะ immutable จึงปลอดภัย) - ใช้ Copy() เมื่อต้องการความชัดเจนในโค้ด หรือเมื่อต้องส่งต่อให้ API ที่อาจพยายามแก้ไขสตริง (นادرةใน .NET)