Phương thức trong C# là một nhóm các lệnh nhằm thực hiện một tác vụ nào đó, dùng phương thức để sử dụng lại code, dễ dàng kiểm tra và bảo trì ứng dụng. Phương thức có thể thuộc về một đối tượng lớp nào đó, hoặc không. Tuy nhiên khai báo phương thức thì phải khai báo trong một lớp.

Giả sử bạn cần tìm tổng các số nguyên từ 1 đến 10, từ 20 đến 37, và từ 35 đến 49. Bạn có thể viết mã như sau:

Nhìn đoạn mã trên ta thấy rằng việc tính tổng các số từ 1 đến 10, từ 20 đến 37 và từ 35 đến 49 là giống nhau, chỉ khác nhau giá trị đưa vào cho số nguyên đầu tiên và số nguyên cuối cùng. Việc này sẽ tốt hơn nếu chúng ta viết mã tính toán một lần và tái sử dụng lại. Chúng ta có thể làm vậy bằng cách tạo ra một phương thức và gọi nó.

Đoạn mã trên có thể được đơn giản như sau:

Phương thức là tập các câu lệnh được nhóm lại với nhau để thực hiện một thao tác. Chúng ta đã sử dụng một số phương thức như  Console.WriteLine(),Console.ReadLine(), Environment.Exit(0), new Random().Next()…. Các phương thức này được định nghĩa trong thư viện C#.

Cách định nghĩa một phương thức trong C#

Định nghĩa một phương thức bao gồm tên phương thức, danh sách các tham số, kiểu dữ liệu trả về và phần thân để thực thi phương thức.

Cú pháp để định nghĩa một phương thức như sau:

Hãy nhìn vào một phương thức tìm số lớn nhất giữa hai số nguyên trong hình 1 dưới đây. Phương thức này được đặt tên là max, có 2 tham số nguyên là num1 và num2, phương thức trả về số lớn hơn trong hai số truyền vào. Hình 1 minh hoạ các thành phần của phương thức này.

Định nghĩa một phương thức

Hình 1: Định nghĩa một phương thức bao gồm phần nguyên mẫu phương thức (method header) và phần thân phương thức (method body)

Phần nguyên mẫu phương thức (method header) xác định bổ từ truy xuất (modifiers), kiểu dữ liệu trả về (return value type), tên phương thức (method name), và danh sách các tham số của phương thức (parameters).

Một phương thức có thể trả về một giá trị. ReturnValueType là kiểu dữ liệu trả về của phương thức. Một vài phương thức thực hiện các hoạt động mà không trả về giá trị, trong trường hợp này, kiểu_trả_về là từ khoá void. Ví dụ kiểu_trả_về là void trong phương thức Main(), cũng như trong Environment.Exit() và Console.WriteLine(). Nếu một phương thức trả về một giá trị, nó được gọi là phương thức trả về gía trị (value-returning method), nếu không nó được gọi là một phương thức không trả về gì (void method).

Các biến được định nghĩa trong method header được biết đến như là các tham số hình thức (formal parameters) hoặc tham số đơn giản (simple parameters). Một tham số giống như một trình giữ chỗ: khi một phương thức được gọi, bạn truyền một giá trị cho tham số, giá trị này được gọi là tham số hay đối số thực (actual parameters).

Phần thân của phương thức chứa tập các lệnh để thực thi phương thức. Phần thân của phương thức max sử dụng lệnh if để xác định số lớn nhất và trả về giá trị của số đó. Để trả về giá trị cho phương thức sử dụng lệnh return. Phương thức kết thúc khi lệnh return được thực thi.

Lưu ý khi định nghĩa một phương thức:

  • Một số ngôn ngữ lập trình đề cập đến phương thức như thủ tục (procedures) hay hàm (functions). Trong các ngôn ngữ đó, phương thức có giá trị trả về được gọi là hàm và phương thức không có dữ liệu trả về được gọi là thủ tục.
  • Trong phần nguyên mẫu phương thức, bạn cần khai báo từng tham số một cách riêng biệt. Ví dụ, max(int num1, int num2) là hợp lệ, nhưng max(int num1, num2) là không hợp lệ.

Chú ý:

  • Chúng ta nói “define a method – định nghĩa một phương thức” và “declare a variable – khai báo một biến”. Đó là cách để tạo sự khác biệt tinh tế ở đây. Một định nghĩa xác định thứ đã định nghĩa là gì, nhưng một khai báo thường liên quan đến việc cấp phát bộ nhớ để lưu trữ dữ liệu cho mục khai báo.

Gọi phương thức là gì? Vì sao phải gọi phương thức trong C#?

Gọi phương thức là cách thực thi mã lệnh trong phương thức đó.

Trong định nghĩa phương thức, bạn định định nghĩa thứ mà phương thức đó làm. Để thực thi phương thức, bạn phải call hoặc invoke nó.

Cách gọi phương thức trong C#

Có 2 cách để gọi một phương thức, tuỳ thuộc vào phương thức đó có trả về giá trị hay không.

Nếu phương thức trả về một giá trị, phương thức được gọi thường xem như một giá trị.

Ví dụ:

Gọi Max(3, 4) và gán kết quả trả về của phương thức cho biến larger.

Một ví dụ khác:

Lệnh trên in giá trị trả về khi gọi phương thức Max(3, 4).

Nếu phương thức trả về void, gọi phương thức phải là một câu lệnh. Ví dụ phương thức WriteLine trả về void.

Dưới đây là minh hoạ:

Chú ý:

Phương thức trả về giá trị cũng có thể được gọi như một câu lệnh trong C#. Trong trường hợp này, nơi gọi bỏ qua giá trị trả về. Điều này thường không được thực hiện nhưng nó được phép nếu nơi gọi không quan tâm đến giá trị trả về.

Khi một chương trình gọi một phương thức, luồng điều khiển chương trình sẽ được chuyển sang cho phương thức được gọi. Phương thức được gọi trả quyền điều khiển cho nơi gọi nó khi câu lệnh return được thực thi hoặc khi gặp dấu } kết thúc phương thức.

Chương trình sử dụng phương thức Main() và phương thức Max()

gọi phương thức trong C#

Chương trình này chứa phương thức Main() và phương thức Max(). Phương thức Main() cũng giống như các phương thức thông thường khác, ngoại trừ một điểm khác biệt là nó được gọi bởi CLR để bắt đầu chương trình.

Nguyên mẫu của phương thức Main: public static void Main(string []args). Trong ví dụ này, nguyên mẫu của phương thức Main gồm: các bổ từ public và static, kiểu dữ liệu trả về: void, tên phương thức Main, và tham số truyền cho phương thức có kiểu mảng chuỗi: string []

Các lệnh trong Main có thể gọi các phương thức khác được định nghĩa ngay trong chính lớp chứa phương thức Main hoặc từ các lớp khác. Trong ví dụ này, phương thức Main gọi phương thức Max(i, j) được định nghĩa trong cùng một lớp với phương thức Main.

Khi phương thức Max được gọi (dòng 15), giá trị của biến i là 5 được chuyển đến biến num1, giá trị của biến j là 2 được chuyển đến biến num2 trong phương thức Max. Quyền điều khiển được truyền sang cho phương thức Max và phương thức Max được thực thi. Khi gặp câu lệnh return trong phương thức Max, phương thức Max trả quyền điều khiển về cho nơi gọi nó (trong trường hợp này phương thức gọi nó là phương thức Main). Quan sát 2 phương thức sau :

Khi phương thức Max được gọi, luồng điều khiển được chuyển đến nó. Sau khi thực thi gặp câu lệnh return sẽ trả quyền điều khiển về nơi đang gọi nó.

Lưu ý:
Lệnh return là cần thiết cho một phương thức trả về giá trị. Phương thức được hiển thị bên dưới trong (a) là chính xác về mặt logic, nhưng nó có lỗi biên dịch vì trình biên dịch C# nghĩa rằng phương thức này có thể không trả lại giá trị.

gọi phương thức trong C#

Để khắc phục vấn đề này, xoá if (n < 0) trong (a)

Chú ý:

Các phương thức cho phép chia sẻ mã lệnh và tái sử dụng lại. Phương thức Max có thể được gọi từ bất kỳ lớp nào, không chỉ trong lớp TestMax. Nếu bạn tạo một lớp mới, bạn có thể gọi phương thức Max bằng cách sử dụng ClassName.MethodName (Ví dụ: TestMax.Max).

Call Stack là gì?

Mỗi lần một phương thức được gọi, hệ thống sẽ tạo một bản ghi kích hoạt (activation record) chứa các tham số và các biến cho phương thức và đặt activation record vào một vùng bộ nhớ gọi la call stack. Một call stack cũng được biết đến như một execution stack, runtime stack hoặc machine stack, và nó thường được rút gọi thành stack. Khi một phương thức gọi một phương thức khác, activation record của phương thức gọi được giữ nguyên, và một activation record mới được tạo cho phương thức được gọi Khi một phương thức kết thúc công việc của nó và trả quyền điều khiển về cho nơi gọi nó, activation record của nó sẽ bị xoá khỏi call stack.

Một call stack chứa các activation record tại lần cuối cùng, lần đầu tiền được đưa ra: activation record cho phương thức được gọi cuối cùng bị xoá ngay lúc đầu từ stack. Ví dụ, giả sử phương thức m1 gọi phương thức m2, và phương thức m2 gọi phương thức m3. Khi hệ thông thực thi đẩy activation record của m1 vào stack, tiếp theo đến m2 và cuối cùng là m3. Sau khi m3 thực thi xong, activation record của nó được xoá khỏi stack. Sau khi m2 thực thi xong, activation record của nó được xoá khỏi stack. Sau khi m1 thực thi xong, activation record của nó được xoá khỏi stack.

Hiểu call stack giúp bạn hiểu rõ cách phương thức được gọi ra. Các biến được định nghĩa trong phương thức max là num1, num2 và result. Các biến num1 và num2 được định nghĩa trong method Signature (tham số hình thức) và là các tham số của phương thức Max. Giá trị của chúng được truyền qua lời gọi phương thức. Hình 2 minh hoạ các activation record cho lời gọi phương thức trong stack.

Hình 2: Khi phương thức max được gọi, quyền điều khiển chuyển sang phương thức max. Khi việc thực thi phương thức max kết thúc, quyền điều khiển này sẽ trả lại cho nơi gọi nó.

ĐỌC THÊM CÁC TÀI LIỆU, HƯỚNG DẪN HỌC LẬP TRÌNH C# KHÁC TẠI ĐÂY.


Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.