พารามิเตอร์ ref (Pass by Reference)
พารามิเตอร์แบบอ้างอิง (reference parameter) คือการส่งตัวแปรโดยอ้างอิงไปยังตำแหน่งหน่วยความจำของตัวแปรนั้นๆ เมื่อคุณส่งพารามิเตอร์แบบอ้างอิง จะไม่มีการสร้างพื้นที่จัดเก็บใหม่สำหรับพารามิเตอร์เหล่านี้ (ต่างจากการส่งแบบค่า value parameter)
คุณสามารถประกาศพารามิเตอร์แบบอ้างอิงได้โดยใช้คีย์เวิร์ด ref ตัวอย่างโค้ดดังนี้:
ตัวอย่างการใช้ ref
using System;
namespace CalculatorApplication
{
class NumberManipulator
{
public void Swap(ref int x, ref int y)
{
int temp;
temp = x; // เก็บค่าของ x
x = y; // ใส่ค่า y ลง x
y = temp; // ใส่ค่า temp (ค่า x เดิม) ลง y
}
static void Main(string[] args)
{
NumberManipulator n = new NumberManipulator();
// กำหนดค่าเริ่มต้น
int a = 100;
int b = 200;
Console.WriteLine("ก่อนสลับค่า, ค่าของ a : {0}", a);
Console.WriteLine("ก่อนสลับค่า, ค่าของ b : {0}", b);
// เรียกใช้เมธอดเพื่อสลับค่า
n.Swap(ref a, ref b);
Console.WriteLine("หลังสลับค่า, ค่าของ a : {0}", a);
Console.WriteLine("หลังสลับค่า, ค่าของ b : {0}", b);
Console.ReadLine();
}
}
}
ผลลัพธ์
ก่อนสลับค่า, ค่าของ a : 100 ก่อนสลับค่า, ค่าของ b : 200 หลังสลับค่า, ค่าของ a : 200 หลังสลับค่า, ค่าของ b : 100
พารามิเตอร์ out (Output Parameter)
คำสั่ง return สามารถส่งค่ากลับได้เพียงค่าเดียวจากเมธอด แต่ด้วยพารามิเตอร์ out คุณสามารถส่งค่ากลับได้หลายค่าจากเมธอดเดียว
ตัวอย่างการใช้ out
using System;
namespace CalculatorApplication
{
class NumberManipulator
{
public void GetValue(out int x)
{
int temp = 10;
x = temp; // กำหนดค่าให้พารามิเตอร์ out
}
static void Main(string[] args)
{
NumberManipulator n = new NumberManipulator();
// ตัวแปร a ต้องถูกประกาศก่อน แต่ไม่จำเป็นต้องกำหนดค่าเริ่มต้น
int a = 150;
Console.WriteLine("ก่อนเรียกเมธอด, ค่าของ a : {0}", a);
// เรียกใช้เมธอดเพื่อรับค่า
n.GetValue(out a);
Console.WriteLine("หลังเรียกเมธอด, ค่าของ a : {0}", a);
Console.ReadLine();
}
}
}
ผลลัพธ์
ก่อนเรียกเมธอด, ค่าของ a : 150 หลังเรียกเมธอด, ค่าของ a : 10
สรุปความแตกต่างหลัก
| คุณสมบัติ | ref | out |
|---|---|---|
| ต้องกำหนดค่าเริ่มต้นก่อนส่ง | ใช่ (บังคับ) | ไม่จำเป็น |
| ต้องกำหนดค่าภายในเมธอดก่อน return | ไม่บังคับ | ใช่ (บังคับ) |
| วัตถุประสงค์ | ส่งค่าเข้าและรับค่าออก (Two-way) | รับค่าออกอย่างเดียว (One-way output) |
| การใช้งานทั่วไป | สลับค่า, แก้ไขค่าตัวแปรเดิม | ส่งค่ากลับหลายค่า, TryParse pattern |
หมายเหตุ: ตั้งแต่ C# 7.0 เป็นต้นมา สามารถประกาศตัวแปร out ได้โดยตรงในการเรียกเมธอด เช่น n.GetValue(out int a); ทำให้โค้ดสะอาดขึ้น