Trang chủ C# cơ bản Hàm trong C#

Hàm trong C#

Nguyễn Dương 07-06-2024

Trong quá trình viết code sẽ có những đoạn code được tái sử dụng nhiều lần, nếu chúng ta copy đi copy lại thì sẽ khiến cho chương trình trở nên rườm rà, rối mắt, khó khăn cho việc sửa chữa. Trong C#, cho phép chúng ta gom những đoạn code đó thành một hàm (function), khi cần tái sử dụng bạn chỉ cần gọi tên hàm là xong. Vậy nên nó sẽ khiến cho chương trình trở nên ngắn gọn, rõ ràng, dễ dàng chỉnh sửa code.

1. CẤU TRÚC HÀM TRONG C#

Cú pháp
<Quyền truy cập> <Kiểu dữ liệu trả về> Tên hàm (<Tham số>)
{
     //Thân hàm
}
Trong đó:
Quyền truy cập: Xác định khả năng truy cập của hàm trong ứng dụng, gồm các từ khóa như static, public, read only ....... và có thể bỏ trống.
Kiểu dữ liệu trả về: Từ khóa void hoặc kiểu int, long, byte hoặc kiểu do người dùng tự định nghĩa như sinhvien, luong.
Tên hàm: Là tên gọi của hàm, do bạn tự đặt, nên đặt tên theo quy tắc đặt tên biến.
Tham số (Parameter): Là danh sách các tham số truyền vào để sử dụng nội bộ trong hàm. Cấu trúc khởi tạo như một biến bình thường. Có thể bỏ trống.

Lưu ý
- Mọi hàm đều phải có cặp ngoặc nhọn { } biểu thị là một khối lệnh. Các dòng code của hàm đều được viết bên trong cặp ngoặc nhọn { } này.
Không thể khai báo một hàm trong một hàm khác theo cách thông thường.
- Hàm chỉ được khai báo bên trong class.

Ví dụ về một hàm cơ bản nhất
static void Main (string[] args)
{

}

Đây là hàm mà khi khởi tạo chương trình C# đều có. Trong đó: 
static là quyền truy cập, hàm Main của console C# thì phải có từ khóa này.
void là kiểu dữ liệu trả về. Với hàm có kiểu trả về là void thì sẽ không cần từ khóa return trong hàm. Hoặc có nhưng chỉ đơn giản là ghi return;
Main là tên hàm. Có thể đặt tùy ý. Nhưng ở trường hợp này là bắt buộc phải là Main vì mỗi chương trình console C# đều cần hàm Main.
string[] args là parameter truyền từ bên ngoài vào để sử dụng hàm. Có thể không có cũng được. nhưng ở trường hợp hàm Main của console C# là bắt buộc phải có. 

Ví dụ
static void Main(string[] args)
{
      Print();
      Console.ReadKey();
}
static void Print()
{
      Console.Write("Chao mung ban den voi quantrimaytinh.com");
}

Trong ví dụ này, mình tạo ra một hàm Print(), có tác dụng in dòng chữ "Chao mung ban den voi quantrimaytinh.com" ra màn hình. Vậy trong hàm Main, mình chỉ cần gọi tên hàm Print() ra là được. Ví dụ trong một chương trình nào đó, mình cần in 10 lần dòng chữ trên ra màn hình thì cứ mỗi lần cần in, mình chỉ cần gọi tên hàm là được. Tiết kiệm được rất nhiều dòng code và thao tác.

2. HÀM CÓ KIỂU TRẢ VỀ KHÁC VOID

Với hàm có kiểu trả về khác void. Trong thân hàm bắt buộc phải có dòng return <Giá trị trả về>;
Giá trị trả về phải có kiểu dữ liệu tương ứng với Kiểu dữ liệu trả về khi khai báo hàm.

Ví dụ
static void Main(string[] args)
{
      Demo();
      Console.ReadKey();
}
static void Demo()
{
      Console.Write(Number());
}
static int Number()
{
      return 69;
}

Trong ví dụ này, mình tạo ra hàm number có kiểu int, giá trị là số nguyên 69. Tạo ra hàm Demo có tác dụng in kết quả của hàm number ra màn hình. Trong hàm Main thì mình gọi hàm Demo. Vậy nên kết quả là chương trình sẽ in số 69 ra màn hình.

Ví dụ
static void Main(string[] args)
{
      Console.WriteLine(Sum(6,9));
      Console.ReadKey();
}
static int Sum(int firstNumber, int secondNumber)
{
      return firstNumber + secondNumber;
}

Kết quả sẽ là 15. Qua ví dụ này ta thấy khai báo Parameter giống như khai báo biến. 
- Các parameter được xem như các biến cục bộ có phạm vị sử dụng trong hàm.
- Các parameter được khởi tạo ngay khi gọi hàm và được hủy khi kết thúc gọi hàm.
- Số lượng parameter là không giới hạn.
Có thể khai báo các parameter với các kiểu dữ liệu khác nhau.
- Khi sử dụng hàm phải truyền vào đủ và đúng parameter. (Đủ số lượng, đúng kiểu dữ liệu và đúng thứ tự như khai báo)
- Hàm sử dụng sẽ tạo ra các bản sao của parameter truyền vào trên RAM. Sau đó dùng những bản sao đó để xử lý dữ liệu. Cho nên kết thúc lời gọi hàm giá trị của các parameter sẽ không bị thay đổi.

Ví dụ: Hàm gọi hàm
static void Main(string[] args)
{
      int firstNum = 1;
      int secondNum = 5;

      for (int count = 1; count <= 20; count++)
      {
           PrintSum(firstNum, secondNum);
           firstNum += count;
           secondNum += count;
      }
      Console.ReadKey();
}
static void PrintSum(int firstNumber, int secondNumber)
{
      Console.WriteLine("{0} + {1} = {2}", firstNumber, secondNumber, Sum(firstNumber, secondNumber));
}
static int Sum(int firstNumber, int secondNumber)
{
      return firstNumber + secondNumber;
}

Kết quả: 

Ví dụ: Hàm có nhiều tham số với các kiểu dữ liệu khác nhau
static void Main(string[] args)
{
      Info("Nguyen Duong", 28, "Blogger");
      Console.ReadKey();
}
static void Info(string name, int age, string job)
{
      Console.WriteLine("toi la {0} {1}, nam nay toi {2} tuoi", job, name, age);
}


Khi truyền tham số phải theo đúng thứ tự và đúng kiểu dữ liệu như khai báo.

Bài viết liên quan

Hàm đệ quy trong C# Hàm đệ quy trong C#
enum trong C# enum trong C#
Struct trong C# Struct trong C#
Lớp String trong C# Lớp String trong C#
Vòng lặp foreach trong C# Vòng lặp foreach trong C#
Mảng đa chiều, mảng của mảng trong C# Mảng đa chiều, mảng của mảng trong C#