การส่งอาร์เรย์เป็นพารามิเตอร์เมธอดใน C#
ใน C# อาร์เรย์เป็น Reference Type เมื่อส่งไปยังเมธอด จะส่ง "อ้างอิง" (reference) ไป ไม่ใช่คัดลอกข้อมูล หมายความว่าเมธอดสามารถแก้ไขค่าในอาร์เรย์ต้นฉบับได้
ตัวอย่าง: ส่งอาร์เรย์เพื่อคำนวณผลรวม
using System;
namespace Test
{
class Demo
{
// เมธอดรับอาร์เรย์และขนาด คืนค่าผลรวม
int DisplaySum(int[] arr, int size)
{
int sum = 0;
for (int i = 0; i < size; ++i)
{
sum += arr[i];
}
return sum;
}
static void Main(string[] args)
{
Demo d = new Demo();
int[] myArr = new int[] { 59, 34, 76, 65, 12, 99 };
int sum = d.DisplaySum(myArr, 5); // ส่ง 5 ตัวแรก
Console.WriteLine($"ผลรวม 5 ตัวแรก: {sum}"); // 59+34+76+65+12 = 246
Console.ReadKey();
}
}
}
ผลลัพธ์
ผลรวม 5 ตัวแรก: 246
จุดสำคัญเกี่ยวกับการส่งอาร์เรย์
| ลักษณะ | คำอธิบาย |
|---|---|
| Pass by Reference (Reference Type) | อาร์เรย์ถูกส่งผ่าน reference เมธอดเข้าถึงข้อมูลเดียวกัน |
| การเปลี่ยนแปลงในเมธอด | ส่งผลต่ออาร์เรย์ต้นฉบับ |
| ไม่ต้องใช้ ref/out | เพราะอาร์เรย์เป็น reference type แล้ว |
| ต้องส่งขนาดแยก | C# ไม่รู้ขนาดอาร์เรย์จากพารามิเตอร์ (ยกเว้นใช้ arr.Length ในเมธอด) |
ตัวอย่าง: แก้ไขค่าในอาร์เรย์จากเมธอด
void ModifyArray(int[] arr)
{
for (int i = 0; i < arr.Length; i++)
{
arr[i] *= 2; // คูณ 2 ทุกค่า - ส่งผลต่ออาร์เรย์ต้นฉบับ
}
}
// การใช้งาน
int[] numbers = { 1, 2, 3 };
ModifyArray(numbers);
// numbers กลายเป็น { 2, 4, 6 }
หากไม่ต้องการให้แก้ไขต้นฉบับ
// 1. ส่งสำเนา (Copy)
ModifyArray((int[])numbers.Clone());
// 2. ใช้ params (สร้างอาร์เรย์ใหม่)
void ModifyParams(params int[] arr) { ... }
// 3. ใช้ ReadOnlySpan (C# 7.2+)
void ReadOnly(ReadOnlySpan arr) { ... } // ไม่สามารถแก้ไขได้
ส่งอาร์เรย์หลายมิติ
void ProcessMatrix(int[,] matrix)
{
int rows = matrix.GetLength(0);
int cols = matrix.GetLength(1);
// ...
}
// เรียกใช้
int[,] mat = new int[3, 3];
ProcessMatrix(mat);