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