ภาพรวม
เมธอด Array.ConstrainedCopy() ใน C# ใช้คัดลอกช่วงขององค์ประกอบจากอาร์เรย์ต้นทาง (source array) เริ่มจากดัชนีที่ระบุ ไปยังอาร์เรย์ปลายทาง (destination array) เริ่มจากดัชนีที่ระบุ ความแตกต่างสำคัญจาก Array.Copy() คือ ConstrainedCopy รับประกันความสมบูรณ์ของข้อมูล (atomic operation) - หากเกิดข้อผิดพลาดระหว่างการคัดลอก อาร์เรย์ปลายทางจะยังคงอยู่ในสถานะเดิม ไม่ได้รับการเปลี่ยนแปลงบางส่วน
ไวยากรณ์
public static void ConstrainedCopy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length);
พารามิเตอร์
- sourceArray - อาร์เรย์ต้นทางที่มีข้อมูลให้คัดลอก
- sourceIndex - ดัชนีเริ่มต้นในอาร์เรย์ต้นทาง (32-bit integer)
- destinationArray - อาร์เรย์ปลายทางที่รับข้อมูล
- destinationIndex - ดัชนีเริ่มต้นในอาร์เรย์ปลายทาง (32-bit integer)
- length - จำนวนองค์ประกอบที่ต้องการคัดลอก (32-bit integer)
ตัวอย่างการใช้งาน
using System;
public class Demo
{
public static void Main()
{
int[] arrDest = new int[10];
Console.WriteLine("องค์ประกอบของอาร์เรย์ต้นทาง...");
int[] arrSrc = { 20, 50, 100, 150, 200, 300, 400 };
for (int i = 0; i < arrSrc.Length; i++)
Console.Write("{0} ", arrSrc[i]);
Console.WriteLine();
// คัดลอก 4 องค์ประกอบ จากดัชนี 3 ของต้นทาง (ค่า 150) ไปยังดัชนี 0 ของปลายทาง
Array.ConstrainedCopy(arrSrc, 3, arrDest, 0, 4);
Console.WriteLine("อาร์เรย์ปลายทาง:");
for (int i = 0; i < arrDest.Length; i++)
Console.Write("{0} ", arrDest[i]);
}
}ผลลัพธ์
องค์ประกอบของอาร์เรย์ต้นทาง... 20 50 100 150 200 300 400 อาร์เรย์ปลายทาง: 150 200 300 400 0 0 0 0 0 0
เปรียบเทียบ Array.Copy() กับ Array.ConstrainedCopy()
| คุณสมบัติ | Array.Copy() | Array.ConstrainedCopy() |
|---|---|---|
| ความน่าเชื่อถือ | อาจทิ้งอาร์เรย์ปลายทางในสถานะบางส่วนหากล้มเหลว | รับประกัน atomic - ทั้งสำเร็จหรือไม่เปลี่ยนแปลงเลย |
| ประสิทธิภาพ | เร็วกว่าเล็กน้อย | ช้ากว่าเล็กน้อย (มี overhead การตรวจสอบ) |
| การใช้งานทั่วไป | การคัดลอกทั่วไป | การคัดลอกที่ต้องความน่าเชื่อถือสูง (critical sections) |
| รองรับชนิดอาร์เรย์ | ทุกชนิด | เฉพาะอาร์เรย์ที่มีชนิดองค์ประกอบเหมือนกัน (type-safe) |
ข้อสังเกตสำคัญ
- ทั้งสองอาร์เรย์ต้องมีชนิดองค์ประกอบที่เข้ากันได้ (type compatibility)
- หากพื้นที่ในอาร์เรย์ปลายทางไม่พอ จะโยน
ArgumentException - เหมาะสำหรับโค้ดที่ต้องการความน่าเชื่อถือสูง เช่น ระบบทำธุรกรรม (transactional systems)