Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

ความแตกต่างระหว่างพารามิเตอร์ ref และ out ใน C# คืออะไร?

พารามิเตอร์ 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

สรุปความแตกต่างหลัก

คุณสมบัติrefout
ต้องกำหนดค่าเริ่มต้นก่อนส่งใช่ (บังคับ)ไม่จำเป็น
ต้องกำหนดค่าภายในเมธอดก่อน returnไม่บังคับใช่ (บังคับ)
วัตถุประสงค์ส่งค่าเข้าและรับค่าออก (Two-way)รับค่าออกอย่างเดียว (One-way output)
การใช้งานทั่วไปสลับค่า, แก้ไขค่าตัวแปรเดิมส่งค่ากลับหลายค่า, TryParse pattern

หมายเหตุ: ตั้งแต่ C# 7.0 เป็นต้นมา สามารถประกาศตัวแปร out ได้โดยตรงในการเรียกเมธอด เช่น n.GetValue(out int a); ทำให้โค้ดสะอาดขึ้น