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

คำสั่ง return ใน C#

คำสั่ง return

คำสั่ง return ใช้เพื่อ คืนค่า จากเมธอดกลับไปยังจุดที่เรียก และ สิ้นสุดการทำงานของเมธอดทันที

รูปแบบการใช้งาน

// เมธอดที่คืนค่า
ReturnType MethodName(Parameters) {
    // ... โค้ด ...
    return value; // คืนค่าและออกจากเมธอด
}

// เมธอดที่ไม่คืนค่า (void)
void MethodName(Parameters) {
    // ... โค้ด ...
    return; // ออกจากเมธอดโดยไม่คืนค่า (Optional)
    // หรือไม่เขียน return ก็ได้ ถ้าอยู่ท้ายเมธอด
}

ตัวอย่าง: คำนวณค่าเฉลี่ยและคืนค่า

double GetAverage(int[] arr, int size) {
    int sum = 0;
    for (int i = 0; i < size; ++i) {
        sum += arr[i];
    }
    double avg = (double)sum / size;
    return avg; // คืนค่า double
}

โค้ดตัวอย่างสมบูรณ์

using System;

namespace ArrayApplication {
    class MyArray {
        double GetAverage(int[] arr, int size) {
            int sum = 0;
            for (int i = 0; i < size; ++i) {
                sum += arr[i];
            }
            double avg = (double)sum / size;
            return avg;
        }
        
        static void Main(string[] args) {
            MyArray app = new MyArray();
            
            // Array 5 ตัว
            int[] balance = { 1000, 2, 3, 17, 50 };
            
            // เรียกเมธอดและรับค่าที่คืนมา
            double avg = app.GetAverage(balance, 5);
            
            Console.WriteLine("Average value is: {0}", avg);
            Console.ReadKey();
        }
    }
}

ผลลัพธ์

Average value is: 214.4

รูปแบบการใช้ return แบบต่างๆ

1. Early Return (Guard Clause) - ลด Nested If

public string GetUserName(int userId) {
    if (userId <= 0) return "Invalid ID"; // Return ทันที
    
    var user = _repository.GetById(userId);
    if (user == null) return "User not found"; // Return ทันที
    
    return user.Name; // Normal Flow
}

2. Return Expression (C# 6.0+ Expression-bodied Members)

// แบบเต็ม
public int Add(int a, int b) {
    return a + b;
}

// แบบ Expression-bodied (สั้นกว่า)
public int Add(int a, int b) => a + b;

// Property
public string FullName => $"{FirstName} {LastName}";

3. Return Tuple (C# 7.0+)

public (int Sum, int Count, double Average) GetStats(int[] numbers) {
    int sum = numbers.Sum();
    int count = numbers.Length;
    double avg = count > 0 ? (double)sum / count : 0;
    return (sum, count, avg);
}

// ใช้งาน
var stats = GetStats(new[] { 1, 2, 3, 4, 5 });
Console.WriteLine($"Sum: {stats.Sum}, Avg: {stats.Average}");

4. Ref Return (C# 7.0+) - คืน Reference

public ref int FindIndex(int[] arr, int value) {
    for (int i = 0; i < arr.Length; i++) {
        if (arr[i] == value) return ref arr[i];
    }
    throw new IndexOutOfRangeException();
}

// ใช้งาน - แก้ไขค่าใน Array ได้!
ref int found = ref FindIndex(arr, 3);
found = 99; // แก้ค่าใน Array จริง

ข้อสังเกตสำคัญ

  • return จะ ออกจากเมธอดทันที โค้ดหลัง return จะไม่ทำงาน (Unreachable Code)
  • เมธอด Non-void ต้องมี return ทุกเส้นทาง (All Code Paths)
  • เมธอด void ใช้ return; เพื่อออกก่อนเวลา (Optional)
  • Constructor ไม่มี return type (ไม่ใช้ return คืนค่า)

Common Mistakes

// ❌ ผิด: ไม่มี return ในบาง Path
public int BadMethod(bool flag) {
    if (flag) return 1;
    // Missing return! Compile Error
}

// ✅ ถูก: มี return ทุก Path
public int GoodMethod(bool flag) {
    if (flag) return 1;
    return 0; // Default
}

// ✅ ถูก: Throw Exception แทน Return
public int AlsoGood(bool flag) {
    if (flag) return 1;
    throw new InvalidOperationException("Flag must be true");
}