CodeGym /Các khóa học /C# SELF /Giá trị trả về và toán tử return

Giá trị trả về và toán tử return

C# SELF
Mức độ, Bài học
Có sẵn

1. Giới thiệu

Giả sử nhé: bạn đặt pizza qua điện thoại (hoặc app, thời đại này mà). Bạn nói cho tổng đài viên các thông tin đặt hàng, và tổng đài viên trả lại bạn kết quả: pizza! Nếu tổng đài viên im lặng — bạn đói, và chẳng có gì vui.

Function cũng vậy: đôi khi nhiệm vụ của nó chỉ là làm gì đó, nhưng thường thì mình muốn function trả lại cái gì đó hữu ích, mà kết quả có thể khác nhau tuỳ input! Ví dụ:

  • Function tính tổng hai số và trả về kết quả.
  • Function nhận tuổi của người dùng và trả về phân loại ("trẻ em", "người lớn", "người già").
  • Function tạo ra một chuỗi đẹp để chào user theo tên.

Giá trị trả về — là cách function “gửi” kết quả làm việc của nó ra ngoài.

2. Chữ ký method với giá trị trả về

Bài trước tụi mình đã thấy mẫu như này:

void PrintHello()
{
    Console.WriteLine("Xin chào!");
}
Method không có giá trị trả về ( void)

Kiểu void nghĩa là function không trả về gì cả (void nghĩa là "rỗng", không có giá trị).

Giờ xem thử function mà có trả về gì đó thì sao:

int Add(int a, int b)
{
    // thân function
}
Method có giá trị trả về ( int)

Ở đây int trước tên function — là kiểu dữ liệu của giá trị trả về. Nếu function trả về chuỗi — ghi string, nếu số thực — double, v.v.

Cú pháp khai báo function như sau:

<kiểu trả về> TenMethod(<tham số>)
{
    // thân function
}
Mẫu chung method có giá trị trả về

Ví dụ các chữ ký khác nhau:

Chữ ký Trả về cái gì
int Sum(int a, int b)
Số nguyên
string GetGreeting(string name)
Chuỗi
double Multiply(double x, double y)
Số thực
bool IsAdult(int age)
Giá trị logic

3. Toán tử return: làm sao trả kết quả từ function

Để mọi thứ chạy được, không chỉ cần ghi đúng kiểu — mà còn phải dạy function gửi kết quả về “bên trên”. Đó là nhiệm vụ của toán tử return. Dùng nó, mình nói: đây, trả lại giá trị này, và function kết thúc luôn tại đó (kiểu như "thoát" ra ngoài ngay lúc đó).

kiểu TenMethod(...)
{
    // tính toán gì đó
    return giá trị;
}
Sơ đồ dùng return

Ví dụ:

int Add(int a, int b)
{
    int sum = a + b;
    return sum; // gửi tổng làm kết quả function
}

Luật quan trọng: kiểu giá trị trả về qua return phải hoàn toàn khớp (hoặc tương thích) với kiểu bạn ghi trong chữ ký method.

4. Ví dụ: viết method trả về gì đó

Vào ví dụ luôn cho dễ hiểu! Xem mấy trường hợp phổ biến nhé.

Ví dụ 1: cộng hai số

int Add(int a, int b)
{
    return a + b;
}

// Dùng:
int result = Add(10, 20);
Console.WriteLine("Tổng: " + result); // Kết quả: Tổng: 30

Ví dụ 2: chào cá nhân

string CreateGreeting(string name)
{
    return "Xin chào, " + name + "!";
}

// Dùng:
string greeting = CreateGreeting("Anna");
Console.WriteLine(greeting); // Kết quả: Xin chào, Anna!

Ví dụ 3: kiểm tra đủ tuổi

bool IsAdult(int age)
{
    return age >= 18;
}

if (IsAdult(21))
{
    Console.WriteLine("Được phép vào.");
}
else
{
    Console.WriteLine("Xin lỗi, chỉ dành cho người lớn.");
}
// Kết quả: Được phép vào.

Ví dụ 4: giá trị trả về dùng trong biểu thức

Console.WriteLine("Gấp đôi: " + MultiplyByTwo(7));

int MultiplyByTwo(int n)
{
    return n * 2;
}

5. Kiểu giá trị trả về: đa dạng và lưu ý

Trong C#, function có thể trả về bất kỳ "kiểu" nào (không chỉ số, chuỗi, v.v.). Một số trường hợp:

  • Số nguyên: int, long, short — dễ hiểu.
  • Số thực: double, float, decimal.
  • Chuỗi: string.
  • Kiểu bool: bool.
  • Mảng: int[], string[] v.v.
  • Kiểu tham chiếu: object của class do bạn tạo.
  • void: trường hợp đặc biệt, không trả về gì.

Tại sao kiểu trả về lại quan trọng vậy?

Compiler kiểm tra rất kỹ xem bạn có trả đúng cái đã hứa không. Nếu hứa trả int, mà lại trả chuỗi hoặc không trả gì — sẽ báo lỗi liền. Kiểu như sếp khó tính ấy.

Ví dụ lỗi:

int GetNumber()
{
    return "42"; // Lỗi! Mong đợi int, không phải string.
}

6. Toán tử return không có giá trị: cho method void

Nói cho công bằng, trong method có kiểu trả về (ví dụ int, string) thì toán tử return luôn phải đi kèm giá trị muốn trả về.

Nhưng! Nếu function khai báo kiểu void, bạn vẫn có thể dùng return không có giá trị — để dừng function ngay lập tức.

void PrintNumbers(int n)
{
    if (n <= 0)
    {
        Console.WriteLine("Số không được âm!");
        return; // Thoát function, không trả gì cả
    }
    for (int i = 1; i <= n; i++)
    {
        Console.WriteLine(i);
    }
}
return không có giá trị trong method void

Cái này tiện nếu bạn muốn dừng function khi gặp điều kiện nào đó, mà không cần trả gì hết.

7. Lỗi thường gặp khi dùng return

Ôi, mấy bạn mới học hay đau đầu vì lỗi liên quan đến return lắm!

Vấn đề #1: thiếu return trong function phải trả về gì đó

int GetValue(bool flag)
{
    if (flag)
        return 1;
    // Ôi! Nếu flag == false thì sao?
}
// Lỗi: không phải mọi nhánh code đều có return!

Cách giải quyết: luôn đảm bảo return ở mọi trường hợp! Ví dụ:

int GetValue(bool flag)
{
    if (flag)
        return 1;
    else
        return 0;
}

Vấn đề #2: kiểu giá trị trả về không khớp

double GetMagicNumber()
{
    return 42; // Thực ra ok (int tự chuyển sang double)
    // Nhưng nếu function trả về int mà bạn trả chuỗi — sẽ lỗi!
}

Luật: kiểm tra kỹ kiểu dữ liệu. Nếu nghi ngờ — ép kiểu rõ ràng:

return (double)42;

Vấn đề #3: return không đúng chỗ

Nhớ là khi gặp return, method dừng ngay lập tức. Mọi thứ sau đó sẽ không chạy!

int GetNumber()
{
    return 5;
    Console.WriteLine("Dòng này sẽ không bao giờ chạy"); // compiler sẽ báo luôn!
}

Vấn đề #4: return trong method void mà lại trả giá trị (cấm nhé!)

void PrintSomething()
{
    return 1; // Không được trả giá trị trong method void!
}
2
Nhiệm vụ
C# SELF, mức độ, bài học
Đã khóa
Phương thức trả về chuỗi lời chào
Phương thức trả về chuỗi lời chào
2
Nhiệm vụ
C# SELF, mức độ, bài học
Đã khóa
Phương thức kiểm tra số chẵn
Phương thức kiểm tra số chẵn
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION