คำสั่ง 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");
}