Out Parameter with Examples

พนิดา อินชัย 650710569

Out Parameter หรือ Output Parameter เป็นพารามิเตอร์ที่ไม่จำเป็นต้องกำหนดค่าเริ่มต้นตัวแปรก่อนส่งไปในเมธอด แต่ต้องมีการกำหนดค่าภายในเมธอด และสามารถคืนค่าจากเมธอดผ่านพารามิเตอร์นั้นได้โดยไม่ต้องใช้การ return ซึ่งการส่งพารามิเตอร์ไปในเมธอดจะเป็นการส่งตัวแปรนั้นๆไปจริง(หน่วยความจำเดียวกัน) เหมือนกับ Reference Parameter นอกจากนั้น Out Parameter จะมีการใช้คีย์เวิร์ด out หน้าตัวพารามิเตอร์ที่ต้องการส่งค่า มักใช้เมื่อเมธอดต้องการส่งคืนค่าหลายค่า


Examples of Out Parameter

One Out Parameter

ตัวอย่างที่ 1

using System;

class GFG {

	static public void Main()
	{
		int i; // ไม่กำหนดค่าเริ่มต้น
		
		Addition(out i);

		Console.WriteLine("The addition of the value is: {0}", i);
	}
	public static void Addition(out int i)
	{
		i = 30;
		i += i;
	}
	
}
  • บรรทัดที่ 7 สร้างตัวแปร i แต่ยังไม่มีการกำหนดค่า

  • บรรทัดที่ 9 มีการเรียกใช้เมธอด Addition และมีการส่งค่าพารามิเตอร์ i ที่มีการใช้คีย์เวิร์ด out ในเมธอด Addition (เป็นการส่งตัวแปร i ไป ค่าของ i สามารถถูกกำหนดหรือเปลี่ยนได้)

  • บรรทัดที่ 11 จะเป็นการแสดงผลหลังจากมีการเรียกใช้เมธอด Addition โดยการแสดง The addition of the value is: 60

  • บรรทัดที่ 13 รับพารามิเตอร์ซึ่งเป็นตัวแปร i จากการเรียกใช้ในบรรทัดที่ 15

  • บรรทัดที่ 15 กำหนดค่าให้ตัวแปร i ให้มีค่าเท่ากับ 30

  • บรรทัดที่ 16 ทำการบวกค่าของตัวแปร i ด้วย i ซึ่งจะทำให้ตัวแปร i มีค่าเท่ากับ 60

Multiple Out Parameter

ตัวอย่างที่ 1

using System;
 
class GFG {
 
    static public void Main()
    {
 
        int i, j; // ไม่กำหนดค่าเริ่มต้น
 
        Addition(out i, out j);
 
        Console.WriteLine("The addition of the value is: {0}", i);
        Console.WriteLine("The addition of the value is: {0}", j);
    }
 
    public static void Addition(out int p, out int q)
    {
        p = 30;
        q = 40;
        p += p;
        q += q;
    }
}
  • บรรทัดที่ 8 สร้างตัวแปร i และ j แต่ยังไม่มีการกำหนดค่า

  • บรรทัดที่ 10 มีการเรียกใช้เมธอด Addition และมีการส่งค่าพารามิเตอร์ i และ j ที่มีการใช้คีย์เวิร์ด out ในเมธอด Addition (เป็นการส่งตัวแปร i, j ไป ค่าของ i, j สามารถถูกกำหนดหรือเปลี่ยนได้)

  • บรรทัดที่ 12 จะเป็นการแสดงผลหลังจากมีการเรียกใช้เมธอด Addition โดยการแสดง The addition of the value is: 60 (แสดงค่า p)

  • บรรทัดที่ 13 จะเป็นการแสดงผลหลังจากมีการเรียกใช้เมธอด Addition โดยการแสดง The addition of the value is: 80 (แสดงค่า q)

  • บรรทัดที่ 16 เมธอด Addition รับพารามิเตอร์ซึ่งเป็นตัวแปร i และ j จากการเรียกใช้ในบรรทัดที่ 15 แต่เขียนเป็นตัวแปร p และ q

  • บรรทัดที่ 18 กำหนดค่าให้ตัวแปร p ให้มีค่าเท่ากับ 30

  • บรรทัดที่ 19 กำหนดค่าให้ตัวแปร q ให้มีค่าเท่ากับ 40

  • บรรทัดที่ 20 ทำการบวกค่าของตัวแปร p ด้วย p ซึ่งจะทำให้ตัวแปร i มีค่าเท่ากับ 60

  • บรรทัดที่ 21 ทำการบวกค่าของตัวแปร q ด้วย q ซึ่งจะทำให้ตัวแปร i มีค่าเท่ากับ 80

ตัวอย่างที่ 2

using System;

class Program
{
    static void Main()
    {
        double radiusValue = 3.92781;
        //Calculate the circumference and area of a circle, returning the results to Main().
        CalculateCircumferenceAndArea(radiusValue, out double      circumferenceResult, out var areaResult);
        Console.WriteLine($"Circumference of a circle with a radius of {radiusValue} is {circumferenceResult}.");
        Console.WriteLine($"Area of a circle with a radius of {radiusValue} is {areaResult}.");
        Console.ReadLine();
    }

    //The calculation worker method.
    public static void CalculateCircumferenceAndArea(double radius, out double circumference, out double area)
    {
        circumference = 2 * Math.PI * radius;
        area = Math.PI * (radius * radius);
    }
}
  • บรรทัดที่ 9 เรียกใช้เมธอด CalculateCircumferenceAndArea และมีการส่งค่าพารามิเตอร์ radiusValue, out circumferenceResult และout areaResult

  • บรรทัดที่ 10 แสดงผลหลังจากมีการเรียกใช้เมธอด CalculateCircumferenceAndArea โดยการแสดง Circumference of a circle with a radius of 3.92781 is 24.678820426416294.

  • บรรทัดที่ 11 แสดงผลหลังจากมีการเรียกใช้เมธอด CalculateCircumferenceAndArea โดยการแสดง Area of a circle with a radius of 3.92781 is 48.46641068266597.

  • บรรทัดที่ 12 เป็นคำสั่งรอการป้อนข้อมูลหรือกด Enter ก่อนจะดำเนินการต่อ

  • บรรทัดที่ 16 เมธอด CalculateCircumferenceAndArea รับพารามิเตอร์จากการเรียกใช้เมธอด บรรทัดที่ 9

  • บรรทัดที่ 18 กำหนดให้ตัวแปร circumference เท่ากับค่าที่หาได้จาก 2 * Math.PI * radius คือ 24.678820426416294

  • บรรทัดที่ 19 กำหนดให้ตัวแปร area เท่ากับค่าที่หาได้จาก Math.PI * (radius * radius) คือ 48.46641068266597


เปรียบเทียบกับภาษา Java, C, Python

Java

Java ไม่รองรับการการทำ out parameter โดยตรงเหมือน C# เพราะ Java มีการส่งพารามิเตอร์แบบ pass by value คือจะส่งค่าของตัวแปรไป ไม่ได้เป็นการส่งตัวแปรจริงไป เพื่อให้ Java มีการทำงานที่คล้าย out parameter สามารถทำได้โดยการห่อพารามิเตอร์ไว้ในออบเจ็กต์ หรือใช้อาเรย์เก็บค่าที่ต้องการแก้ไขหรือส่งคืน

C#

using System;

class Out_Parameter {
  static void Divide(int x, int y, out int divide_result, out int divide_remainder) {
    divide_result = x / y;
    divide_remainder = x % y;
  }

  static void Main() {
    for (int x = 1; x < 5; x++)
      for (int y = 1; y < 5; y++) {
        int result, remainder;
        Divide(x, y, out result, out remainder);
        Console.WriteLine("{0} / {1} = {2}r{3}", x, y, result, remainder);
      }
  }
}
  • บรรทัดที่ 3 รับพารามิเตอร์ x, y, out result, out remainder จากการเรียกใช้ในบรรทัดที่ 14

  • บรรทัดที่ 4 กำหนดค่าให้ตัวแปร divide_result ให้มีค่าเท่ากับ x / y

  • บรรทัดที่ 5 กำหนดค่าให้ตัวแปร divide_remainder ให้มีค่าเท่ากับ x % y

  • บรรทัดที่ 12 สร้างตัวแปร result และ remainder แต่ยังไม่มีการกำหนดค่า

  • บรรทัดที่ 13 มีการเรียกใช้เมธอด Divide และมีการส่งค่าพารามิเตอร์ x, y, out result, out remainder

  • บรรทัดที่ 14 จะเป็นการแสดงผลหลังจากมีการเรียกใช้เมธอด Divide ในรูปแบบ x / y = result r remainder

Java

package delftstack;

class Result {
    int result;
    int remainder;
  
    public Result(int result, int remainder) {
      this.result = result;
      this.remainder = remainder;
    }
  }

public class Out_Parameter {
    static void divide(int x, int y, Result result) {
        result.result = x / y;
        result.remainder = x % y;
    }

    public static void main(String[] args) {
        for (int x = 1; x < 5; x++)
            for (int y = 1; y < 5; y++) 
                //int result = 0, remainder = 0;
                Result result = new Result (0,0);
                divide(x, y, result);
                System.out.println(x + "/" + y + " = " + result.result + " r " + result.remainder);
    }
}
  • บรรทัดที่ 3 สร้างคลาส Result เพื่อเก็บค่า result และ remainder

  • บรรทัดที่ 14 รับพารามิเตอร์ x, y, result (ออบเจ็บของคลาส Result)

  • บรรทัดที่ 15 เปลี่ยนค่าตัวแปร result ของคลาส Result ให้เท่ากับ x / y

  • บรรทัดที่ 16 เปลี่ยนค่าตัวแปร remainder ของคลาส Result ให้เท่ากับ x % y

  • บรรทัดที่ 17 แสดงผลลัพธ์ ในรูปแบบ x / y = result r remainder

  • บรรทัดที่ 24 สร้างออบเจ็กต์ใหม่ของคลาส Result

  • บรรทัดที่ 25 เรียกใช้งานเมธอด divide และส่งพารามิเตอร์ x, y, result (ออบเจ็บของคลาส Result)

จากโค้ด Java จะเห็นได้ว่ามีการห่อพารามิเตอร์ไว้ในออบเจ็ต์ของคลาส Result เพื่อแก้ไขค่าของพารามิเตอร์นั้นๆ เมื่อมีการแก้ไขตอนเรียกใช้เมธอด และให้มีการทำงานที่คล้ายกับการใช้คีย์เวิร์ด out ใน C#

C

C ไม่รองรับการทำ out parameter แต่สามารถทำให้มีการทำงานคล้ายได้ โดยการส่งค่าผ่าน pointer เพื่อให้สามารถเปลี่ยนค่าของตัวแปรนั้นๆได้

C#

using System;
using static System.Console;

namespace OutExample
{
    class Program
    {
        static void Main(string[] args)
        {
            WriteLine("Please enter radious for circle");
            double radious = Convert.ToDouble(ReadLine());
            double circumference = CalculateCircle(radious, out double area);
            WriteLine($"Circle's circumference is {circumference}");
            WriteLine($"Circle's Area is {area}");
            ReadKey();
        }

       static double CalculateCircl
  • บรรทัดที่ 10 แสดงข้อความ Please enter radius for circle เพื่อให้ผู้ใช้ป้อนรัศมี

  • บรรทัดที่ 11 ประกาศตัวแปร radius เป็นชนิด double เพื่อเก็บค่าของตัวแปร radius ที่ได้จากการรับค่าจากผู้ใช้และแปลงเป็น double

  • บรรทัดที่ 12 ประกาศตัวแปร circumference เป็นชนิด double เพื่อเก็บค่าจากการเรียกใช้เมธอด CalculateCircle ที่ส่งพารามิเตอร์ radius, out area

  • บรรทัดที่ 13 แสดงผลลัพธ์ของเส้นรอบวง คือ Circle's circumference is 21.991148575128552

  • บรรทัดที่ 14 แสดงผลลัพธ์ของพื้นที่วงกลม คือ Circle's Area is 38.48451000647496

  • บรรทัดที่ 18 เมธอด CalculateCircle รับพารามิเตอร์ radius, out area

  • บรรทัดที่ 20 คำนวณพื้นที่แล้วเก็บค่าไว้ในตัวแปร area

  • บรรทัดที่ 21 ประกาศตัวแปร circumference เป็นชนิด double โดยจะเก็บค่าที่คำนวณเส้นรอบวง

  • บรรทัดที่ 22 คืนค่าเส้นรอบวง(ค่าของตัวแปร circumference)ไปยังตัวที่เรียกใช้

จะเห็นได้ว่าบรรทัดที่ 22 จะไม่มีการคืนค่าของตัวแปร area เพราะ area ถูกส่งมาเป็น out parameter จึงไม่ต้อง return ค่ากลับ

C

#include <stdio.h>
#include <math.h>

// Function to calculate circumference and area
double CalculateCircle(double radius, double* area) {
    *area = M_PI * pow(radius, 2); // Calculate area using pointer
    double circumference = 2 * M_PI * radius;
    return circumference;
}

int main() {
    double radius, circumference, area;

    // Input radius
    printf("Please enter radius for circle: ");
    scanf("%lf", &radius);

    // Call function to calculate circumference and area
    circumference = CalculateCircle(radius, &area);

    // Output the results
    printf("Circle's circumference is: %.2lf\n", circumference);
    printf("Circle's area is: %.2lf\n", area);

    
}
  • บรรทัดที่ 5 เมธอด CalculateCircle รับพารามิเตอร์ radius และ area แบบ pointer เพื่อให้สามารถเปลี่ยนค่าของตัวแปร area ได้

  • บรรทัดที่ 6 คำนวณพื้นที่ของวงกลมแล้วเก็บค่าตรงที่อยู่ที่ area ชี้้ไป

  • บรรทัดที่ 7 คำนวณเส้นรอบวงแล้วเก็บที่ตัวแปร circumference

  • บรรทัดที่ 8 คืนค่าเส้นรอบว(ค่าของตัวแปร circumference)ไปยังตัวที่เรียกใช้

  • บรรทัดที่ 12 ประกาศตัวแปร radius, circumference, area

  • บรรทัดที่ 15 แสดงข้อความ Please enter radius for circle เพื่อให้ผู้ใช้กรอกรัศมี

  • บรรทัดที่ 16 รอรับค่ารัศมีจากผู้ใช้ แล้วเก็บในตัวแปร radius

  • บรรทัดที่ 19 ประกาศตัวแปร circumference เป็นชนิด double เพื่อเก็บค่าจากการเรียกใช้เมธอด CalculateCircle ที่ส่งพารามิเตอร์ radius, & area (ที่อยู่ของตัวแปร area)

  • บรรทัดที่ 22 แสดงผลลัพธ์ของเส้นรอบวง คือ Circle's circumference is 21.991148575128552

  • บรรทัดที่ 23 แสดงผลลัพธ์ของพื้นที่วงกลม คือ Circle's Area is 38.48451000647496

เห็นได้ว่าการส่งค่า pointer ใน C จะคล้ายกับการส่ง out parameter สามารถแก้ไขหรือเปลี่ยนค่าของตัวแปรนั้นๆได้เหมือนกัน

Python

Python ไม่รองรับการทำ out parameter แต่ Python สามารถส่งคืนค่าหลายค่าได้เหมือนการใช้ out parameter ใน C# โดยการใช้ tuple ในการคืนค่าหลายค่า แต่ยังต้องกำหนดค่าเริ่มต้นให้ตัวแปรนั้นๆ

C#

using System;
 
class GFG {
 
    // Main method
    static public void Main()
    {
 
        // Declaring variables
        // without assigning values
        int i, j;
 
        // Pass multiple variable to 
        // the method using out keyword
        Addition(out i, out j);
 
        // Display the value i and j
        Console.WriteLine("The addition of the value is: {0}", i);
        Console.WriteLine("The addition of the value is: {0}", j);
    }
 
    // Method in which out parameters
    // are passed and this method returns 
    // the values of the passed parameters
    public static void Addition(out int p, out int q)
    {
        p = 30;
        q = 40;
        p += p;
        q += q;
    }
}
  • บรรทัดที่ 11 สร้างตัวแปร i และ j แต่ยังไม่มีการกำหนดค่า

  • บรรทัดที่ 15 มีการเรียกใช้เมธอด Addition และมีการส่งค่าพารามิเตอร์ i และ j ที่มีการใช้คีย์เวิร์ด out ในเมธอด Addition (เป็นการส่งตัวแปร i, j ไป ค่าของ i, j สามารถถูกกำหนดหรือเปลี่ยนได้)

  • บรรทัดที่ 18 จะเป็นการแสดงผลหลังจากมีการเรียกใช้เมธอด Addition โดยการแสดง The addition of the value is: 60 (แสดงค่า p)

  • บรรทัดที่ 19 จะเป็นการแสดงผลหลังจากมีการเรียกใช้เมธอด Addition โดยการแสดง The addition of the value is: 80 (แสดงค่า q)

  • บรรทัดที่ 25 เมธอด Addition รับพารามิเตอร์ซึ่งเป็นตัวแปร i และ j จากการเรียกใช้ในบรรทัดที่ 15 แต่เขียนเป็นตัวแปร p และ q

  • บรรทัดที่ 27 กำหนดค่าให้ตัวแปร p ให้มีค่าเท่ากับ 30

  • บรรทัดที่ 28 กำหนดค่าให้ตัวแปร q ให้มีค่าเท่ากับ 40

  • บรรทัดที่ 29 ทำการบวกค่าของตัวแปร p ด้วย p ซึ่งจะทำให้ตัวแปร i มีค่าเท่ากับ 60

  • บรรทัดที่ 30 ทำการบวกค่าของตัวแปร q ด้วย q ซึ่งจะทำให้ตัวแปร i มีค่าเท่ากับ 80

Python

def addition():
    p = 30
    q = 40
    p += p
    q += q
    return p, q

# Main method
i, j = addition()

# Display the value i and j
print(f"The addition of the value is: {i}")
print(f"The addition of the value is: {j}")
  • บรรทัดที่ 1-6 เมธอด addition กำหนดค่าเริ่มต้นให้ p = 30 , q = 30 จากนั้นทำการบวกค่าของ p ด้วย p และ q ด้วย q จากนั้นทำการคืนค่าของตัวแปร p และ q ในรูปแบบของ tuple

  • บรรทัดที่ 9 เรียกใช้เมธอด addition ได้รับค่าของ p และ q ที่ถูกบวกแล้วมาเก็บในตัวแปร i และ j (เป็นการับค่าหลายค่าจาก tuple)

  • บรรทัดที่ 12 -13 แสดงค่าที่ได้จากเมธอด addition โดยใช้รูปแบบ f-string แสดงเป็น The addition of the value is: 60 และ The addition of the value is: 80

จะเห็นได้ว่าการใช้ tuple ของ Python ทำให้ Python สามารถคืนค่าได้หลายค่าเหมือนการใช้ out parameter ใน C# Python จึงไม่จำเป็นต้องมี out parameter เพราะมีการใช้ tuple ทดแทนการคืนค่าหลายค่าจากการใช้ out parameter แล้ว


Video & Slide Presentation

Video Presentation

Slide Presentation


Reference

  • ใช้ในการศึกษา Out Parameter, การทำงานของ Out Parameter, การยกตัวอย่างที่ 2 ของ Multiple out Parameterและตัวอย่างโค้ด C# เพื่อนำไปเปรียบเทียบกับ C

Article. (30 มีนาคม 2567). out keyword. Microsoft.https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/out

  • ใช้ในการยกตัวอย่างของ one out parameter และตัวอย่างที่1 ของ Multiple out Parameter

ankita_saini. (1 ตุลาคม 2564). Out Parameter With Examples in C#. GeeksforGeeks. https://www.geeksforgeeks.org/out-parameter-with-examples-in-c-sharp/

  • ใช้ในการหาข้อมูลเปรียบเทียบระหว่าง Java และ C#

Sheeraz Gul. (12 ตุลาคม 2566). Java Out Parameter. DelftStack. https://www.delftstack.com/howto/java/java-out-parameter/#author

  • ใช้ในการหาข้อมูลเปรียบเทียบระหว่าง Python และ C#

nedbat และ JelleZijlstra. (1 ตุลาคม 2564). The Python Tutorial. docs.python. https://docs.python.org/3/tutorial/controlflow.html#defining-functions

  • ใช้ในการหาข้อมูลเปรียบเทียบระหว่าง C และ C#

Merlin Wellington. (18 มกราคม 2567). Intro to C Pointers - Output Parameters (C - Pointers - 1).[Video]. YouTube. https://www.youtube.com/watch?v=mr9pGC6FAzw

Last updated