Function trong C#

Sharing is caring!

Các bạn đã giải bài tập chưa, nếu chưa thì tập giải đi nha. Trong khi giải bài tập, có những bài các bạn sẽ viết code rất là dài trong hàm Main. Điều này cũng bình thường thôi, nhưng mà nó sẽ làm cho chúng ra rối mắt khi đọc lại code, hoặc khi người khác review code của các bạn viết cũng rất khó khăn, hoặc có một số đoạn code các bạn có thể dùng đi dùng lại ở một vài chổ trong chương, chẳng lẽ cứ phải viết lại (hoặc copy/paste xuống dưới). Để viết code cho gọn, các bạn sẽ tách các đoạn logic code ra thành từng hàm, sau đó gọi lại hàm đó ở nhưng nơi mà các bạn muốn. Hôm nay, tui sẽ giới thiệu về cách viết hàm như thế.

1. Khái niệm hàm:

Hàm là một khối các dòng lệnh được đặt tên, để thực thi một thao tác nào đó, sau đó trả về một kết quả mong muốn. Hàm được tạo khi ta có nhu cầu sử dụng lại một khối lệnh nào đó nhiều lần ở những nơi khác nhau trong chương trình.

Cấu trúc của một hàm như sau:

Ở đây, tạm thời các bạn hiểu từ khóa static là để chúng ta có thể gọi cái hàm này trong hàm Main của chương trình nhá. Sau này học hướng đối tượng thì các bạn sẽ tìm hiểu kỹ hơn.

Các bạn chú ý, lệnh return là lệnh dùng để kết thúc một hàm đồng thời trả giá trị ra khỏi hàm. Thông thường, return sẽ được đặt ở cuối hàm, nhưng cũng có trường hợp ta có thể đặt return ở bất kỳ nơi đâu trong thân hàm tùy theo hoàn cảnh cụ thể.

Nếu như hàm của các bạn không cần phải trả giá trị về thì các bạn viết như sau:

Các bạn thay return_type bằng từ khóa void (có nghĩa là không trả giá trị gì), không cần dùng lệnh return. Đa số trường hợp, các bạn sẽ không dùng lệnh return, nhưng trong trường hợp cần dùng lệnh return để thoát khỏi hàm thì các bạn viết là return null;

Còn một lưu ý nữa là các bạn không được viết hàm bên trong một hàm khác nha. Cái này các bạn mới học thường viết như vầy lắm nà:

Để sử dụng hàm, các bạn chỉ cần gọi tên hàm như sau:

2. Tham số của hàm:

Khi viết hàm, chúng ta sẽ có nhu cầu là truyền cái gì đó vào trong hàm, sau đó tính toán, làm đủ thứ trò trong thân hàm, sau đó trả giá trị ra ngoài hàm. Do đó, để truyền giá trị vào trong hàm, ta cần cái tham số (parameter) để nhận giá trị đầu vào này.

Các biến p1, p2, …pn được gọi là biến tham số của hàm.

Ta viết lại hàm Add() với 2 tham số là x, y để làm phép công 2 số bất kỳ:

Biến: a, b. Biểu thức: (a * 2), (b + 5). Số nguyên: 3, 15 được gọi là các đối số (Argument) của hàm Add()

3. Phân loại tham số trong C#:

Trong C#, chúng ta có tất cả 6 loại tham số:

  1. Value parameter
  2. Reference parameter
  3. Output parameter
  4. In parameter
  5. Optional parameter
  6. Parameter array

Đối với Parameter Array thì chúng ta sẽ học trong bài Array.

4. Cách truyền tham số:

4.1. Value Parameter:

Giá trị truyền vào trong hàm sẽ được copy ra từ đối số (đa số trường hợp chúng ta sẽ truyền theo kiểu này). Điều này có nghĩa là nếu trong thân hàm các bạn có thay đổi giá trị của tham số thì cũng không ảnh hưởng đến giá trị của đối số.

Ví dụ kinh điển: hàm Swap là hàm hoán đổi giá trị của hai số a = 5, b = 10 ==> mong muốn sau khi hoán đổi: a = 10, b = 5

Kết quả:

Before call method:

a=5,b=10

After call method:

a=5,b=10

trước và sau khi gọi hàm Swap, giá trị của a, b vẫn không đổi. Các bạn xem hình sau sẽ hiểu cơ chế:

a, b đã được copy giá trị ra một vùng nhớ khác (màu cam), khi đó x, y chỉ tham chiếu đến giá trị vùng nhớ màu cam thôi, khi thay đổi giá trị x, y trong thân hàm thì cũng chỉ thay đổi giá trị trên vùng nhớ màu cam thôi. Cho nên cuối cùng giá trị của a,b ở vùng nhớ màu xanh không thay đổi. Đó là các truyền tham trị (value parameter)

4.2. Reference parameter:

Để thay đổi được giá trị của a, b sau khi gọi hàm Swap, ta dùng kiểu tham chiếu như sau, ta thêm từ khóa ref vào trước tham số và đối số khi muốn thay đổi giá trị.

Các biến truyền theo kiểu ref phải được khởi tạo giá trị trước khi truyền, và trong thân hàm ta có thể không thay đổi giá trị của nó cũng được

Kết quả:

Before call method:

a=5,b=10

After call method:

a=10,b=5

Sau khi gọi hàm Swap, thì giá trị của a, b đã thay đổi. Xem hình sau để hiểu cơ chế:

Do ta dùng từ khóa ref, cho nên lúc này a và x đều tham chiếu đến cùng một vùng nhớ do đó khi thay đổi giá trị của x thì a cũng thay đổi luôn (tương tự cho b và y).

4.3. Output parameter:

Thằng này thì dùng từ khóa out cho tham số và đối số. Nó cũng giống như truyền theo kiểu ref, giá trị của biến sẽ thay đổi sau khi gọi hàm.

Chú ý là nó khác kiểu ref ở điểm sau: có thể không cần khởi tạo giá trị trước khi truyền vào hàm, nhưng trong thân hàm bắt buộc phải thay đổi hoặc gán giá trị mới cho nó.

Kết quả:

Before call method:

a=0

After call method:

a=15

4.4. In parameter:

Cái loại này cũng ít dùng, nhưng tui cũng nói sơ qua cho các bạn biết. Truyền biến kiểu này thì dùng từ khóa in ở trước tham số và đối số, kiểu truyền biến của nó cũng giống như ref nhưng có điều là ta không thể thay đổi giá trị của nó trong thân hàm. Dùng kiểu này khi ta muốn chắc chắn rằng biến ta truyền vào có thể được dùng nhưng không thể được thay đổi.

4.5 Optional parameter:

Optional parameter là tham số cho phép ta đặt cho tham số một giá trị mặc định, có nghĩa là nếu ta không truyền đối số cho nó thì nó sẽ lấy giá trị mặc định đó để sử dụng.

Kết quả:

Name: Peter, Age: 18

Name: Mike, Age: 18

Name: Sarah, Age: 24

Chú ý: khi muốn truyền đối số cho hàm mà không theo thứ tự của tham số, các bạn viết như sau: tham_số: đối_số

Tóm lại, đối với tham số của hàm, thì 3 kiểu value, ref, out thì được dùng nhiều.

Bài tập cho các bạn, các bạn viết lại các bài tập ở bài trước bằng cách tạo hàm và gọi nó trong hàm Main nhé.

 

Sharing is caring!

Câu lệnh điều khiển trong C#

Vincent Le

Tui là Lê Minh Đạt, tên tiếng anh là Vincent(do thích nhân vật Vincent Valentine, ai từng là fan của trò Final Fantasy VII thì sẽ biết nhân vật này, hehe). Đang tập tành làm một blogger viết về mảng lập trình, mong muốn được chia sẻ những gì đã học được, tích góp được trong 10 năm đi làm thợ code.

shares