Phương thức trong C#

Một phương thức là một nhóm lệnh cùng nhau thực hiện một tác vụ. Mỗi chương trình C# có ít nhất một lớp với một phương thức là Main.

Để sử dụng một phương thức trong C#, bạn cần:

  • Định nghĩa phương thức
  • Gọi phương thức

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

Khi bạn định nghĩa một phương thức, về cơ bản, bạn khai báo các thành phần trong cấu trúc của nó. Cú pháp để định nghĩa một phương thức trong C# là như sau:

<Access Specifier> <Return Type> <Method Name>(Parameter List) 
{
   Method Body
}

Dưới đây là chi tiết về các thành phần trong một phương thức:

  • <Access Specifier>: Là từ khóa chỉ thị truy cập. Nó định nghĩa khả năng môi trường bên ngoài tương tác với phương thức trong class.
  • <Return Type>: Là kiểu dữ liệu trả về. Một phương thức có thể trả về một giá trị. Kiểu trả về là kiểu dữ liệu của giá trị mà phương thức trả về. Nếu phương thức không trả về bất kỳ giá trị nào, thì kiểu trả về là void.
  • <Method Name>: Tên phương thức là một định danh duy nhất và nó phân biệt chữ hoa thường. Tên phương thước hợp lệ gồm chữ (hoa và thường), số, ký tự gạch dưới _ và phải bắt đầu bằng chữ.
  • Parameter List: Danh sách tham số được bao quanh trong dấu ngoặc đơn, các tham số này được sử dụng để truyền và nhận dữ liệu từ một phương thức. Danh sách tham số liên quan tới kiểu, thứ tự, và số tham số của một phương thức. Các tham số là tùy ý, tức là một phương thức có thể không chứa tham số nào.
  • Method Body: Phần thân phương thức gồm các câu lệnh để thực hiện một tác vụ nào đó.

Ví dụ

Chương trình sau minh họa một hàm FindMax nhận hai giá trị integer và trả về số nào lớn hơn trong hai số. Nó có chỉ thị truy cập là public, vì thế nó có thể được truy cập từ bên ngoài lớp bằng cách sử dụng một thể hiện của lớp đó.

class NumberManipulator 
{
   public int FindMax(int num1, int num2) 
   {
      return num1 > num2 ? num1 : num2;
   }   
}

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

Bạn có thể gọi một phương thức bằng cách sử dụng tên của phương thức đó. Ví dụ sau minh họa cách gọi phương thức trong C#:

using System;

namespace CalculatorApplication 
{
   class NumberManipulator 
   {
      public int FindMax(int num1, int num2) 
      {
         return num1 > num2 ? num1 : num2;
      }
      
      static void Main(string[] args) 
      {
         int a = 100, b = 200;
         NumberManipulator n = new NumberManipulator();

         //calling the FindMax method
         int result = n.FindMax(a, b);
         Console.WriteLine("Max value is : {0}", result);
         Console.ReadLine();
      }
   }
}

Kết quả khi thực thi đoạn mã trên:

Max value is : 200

Bạn cũng có thể gọi phương thức công khai từ các lớp khác bằng cách sử dụng thể hiện của lớp. Ví dụ, phương thức FindMax thuộc về lớp NumberManipulator , bạn có thể gọi nó từ một lớp Test khác .

using System;

namespace CalculatorApplication 
{
   class NumberManipulator 
   {
      public int FindMax(int num1, int num2) 
      {
         return num1 > num2 ? num1 : num2;
      }
   }
   class Test 
   {
      static void Main(string[] args) 
      {
         /* local variable definition */
         int a = 100, b = 200;         
         NumberManipulator n = new NumberManipulator();
         
         //calling the FindMax method
         int result = n.FindMax(a, b);
         Console.WriteLine("Max value is : {0}", result);
         Console.ReadLine();
      }
   }
}

Kết quả khi chạy chương trình trên:

Max value is : 200

Gọi phương thức đệ quy trong C#

Một phương thức có thể gọi chính nó. Điều này được gọi là đệ quy . Sau đây là một ví dụ tính toán giai thừa của một số đã cho bằng cách sử dụng phương thức đệ quy:

using System;

namespace CalculatorApplication 
{
   class NumberManipulator 
   {
      public int Factorial(int num) 
      {
         int result;
         if (num == 1) 
         {
            return 1;
         } 
         else 
         {
            result = Factorial(num - 1) * num;
            return result;
         }
      }
      
      static void Main(string[] args) 
      {
         NumberManipulator n = new NumberManipulator();
         
         Console.WriteLine("Factorial of 7 is : {0}", n.Factorial(7));
         Console.ReadLine();
      }
   }
}

Đây là kết quả khi chạy chương trình trên:

Factorial of 7 is: 5040

Truyền tham số cho phương thức trong C#

Khi gọi phương thức có tham số, bạn cần truyền các tham số cho phương thức đó. Có 3 cách truyền tham số tới một phương thức trong C#:

Tên Miêu tả
Tham số giá trị Cách này sẽ sao chép giá trị thực sự của một tham số vào trong tham số chính thức của hàm đó. Trong trường hợp này, các thay đổi được tạo ra với tham số chính thức bên trong hàm này sẽ không ảnh hưởng tới tham số đó
Tham số tham chiếu Cách này sẽ sao chép tham chiếu tới vị trí bộ nhớ của một tham số vào trong tham số chính thức. Nghĩa là các thay đổi được tạo ra tới tham số chính thức ảnh hưởng tới tham số đó
Tham số đầu ra Cách này giúp ích khi cần phương thức trả về nhiều hơn một giá trị

Truyền tham số giá trị trong C#

Đây là cơ chế mặc định để truyền tham số cho một phương thức. Trong cơ chế này, khi một phương thức được gọi, một vị trí lưu trữ mới được tạo cho mỗi tham số giá trị.

Các giá trị thực sự của tham sốđược sao chép. Do đó, những thay đổi được thực hiện cho tham số bên trong phương thức không ảnh hưởng đến đối số. Ví dụ sau đây sẽ minh họa cho bạn thấy:

using System;

namespace CalculatorApplication 
{
   class NumberManipulator 
   {
      public void Swap(int a, int b) 
      {
         int temp;
         
         temp = a; /* save the value of a */
         a = b;    /* put b into a */
         b = temp; /* put temp into b */
      }
      
      static void Main(string[] args) 
      {
         NumberManipulator n = new NumberManipulator();
         
         /* local variable definition */
         int a = 100;
         int b = 200;
         
         Console.WriteLine("Before swap, value of a : {0}", a);
         Console.WriteLine("Before swap, value of b : {0}", b);
         
         /* calling a function to swap the values */
         n.Swap(a, b);
         
         Console.WriteLine("After swap, value of a : {0}", a);
         Console.WriteLine("After swap, value of b : {0}", b);
         
         Console.ReadLine();
      }
   }
}

Kết quả khi chạy chương trình:

Before swap, value of a : 100
Before swap, value of b : 200
After swap, value of a : 100
After swap, value of b : 200

Nó cho thấy rằng không có thay đổi các giá trị của biến ab mặc dù chúng đã hoán đổi cho nhau bên trong phương thức Swap.

Truyền tham số tham chiếu trong C#

Tham số tham chiếu là tham chiếu đến vị trí bộ nhớ của biến. Khi bạn truyền tham số bằng tham chiếu, không giống như tham số giá trị, vị trí lưu trữ mới không được tạo cho các tham số này.

Điều này có nghĩa là khi giá trị của các tham số bị thay đổi bên trong phương thức thì giá trị của các biến truyền vào tham số của phương thức cũng thay đổi theo.

Bạn có thể khai báo các tham số tham chiếu bằng cách sử dụng từ khóa ref . Ví dụ sau đây minh họa điều này:

using System;

namespace CalculatorApplication 
{
   class NumberManipulator 
   {
      public void Swap(ref int a, ref int b) 
      {
         int temp;

         temp = a; /* save the value of a */
         a = b;    /* put b into a */
         b = temp; /* put temp into b */
      }
      
      static void Main(string[] args) 
      {
         NumberManipulator n = new NumberManipulator();
         
         /* local variable definition */
         int a = 100;
         int b = 200;

         Console.WriteLine("Before swap, value of a : {0}", a);
         Console.WriteLine("Before swap, value of b : {0}", b);

         /* calling a function to swap the values */
         n.Swap(ref a, ref b);

         Console.WriteLine("After swap, value of a : {0}", a);
         Console.WriteLine("After swap, value of b : {0}", b);
 
         Console.ReadLine();
      }
   }
}

Kết quả khi chạy chương trình:

Before swap, value of a : 100
Before swap, value of b : 200
After swap, value of a : 200
After swap, value of b : 100

Nó cho thấy rằng giá trị của biến ab đã bị thay đổi bên trong hàm Swap và thay đổi này phản ánh trong hàm Main .

Lưu ý: phải khởi tạo giá trị cho biến truyền vào làm tham số tham chiếu.

Truyền tham số đầu ra trong C#

Một câu lệnh return có thể được sử dụng để trả về chỉ một giá trị từ phương thức. Tuy nhiên, bằng cách sử dụng các tham số đầu ra , bạn có thể trả về nhiều giá trị từ một phương thức.

Các tham số đầu ra tương tự như các tham số tham chiếu, ngoại trừ việc chúng truyền dữ liệu ra khỏi phương thức chứ không phải vào nó.

Ví dụ sau minh họa điều này:

using System;

namespace CalculatorApplication 
{
   class NumberManipulator 
   {
      public void GetValue(out int x) 
      {
         int temp = 5;
         x = temp;
      }
      
      static void Main(string[] args) 
      {         
         int a;
         NumberManipulator numberManipulator = new NumberManipulator();
         
         /* calling a function to get the value */
         numberManipulator.GetValue(out a);

         Console.WriteLine("Method call, value of a : {0}", a);
         Console.ReadLine();
      }
   }
}

Kết quả khi chạy chương trình:

Method call, value of a : 5
Lưu ý: không cần khởi tạo trước giá trị cho biến truyền vào làm tham số đầu ra.

Kết luận

Bài viết đã trình bày rất chi tiết về phương thức trong C# từ cách tạo phương thức đến gọi thực thi phương thức, sự khác nhau giữa 3 cách truyền tham số cho phương thức.

Nếu có câu hỏi hay bất kỳ thắc mắc gì bạn đừng ngần ngại để lại comment ở bên dưới nhé. Mình sẽ cố gắng giải đáp sớm nhất trong vòng 24 giờ.

Bạn có muốn xem bài viết tiếp theo không? Nó ở dưới đây nè.

Mảng trong C# | Comdy
Mảng trong C# là gì? Làm sao để tạo và sử dụng mảng trong C#. Bài viết này sẽ hướng dẫn chi tiết cho bạn.


Bài viết liên quan:

Hướng dẫn này sẽ giúp bạn tìm hiểu về đọc ghi file (File I/O) trong C# và sử dụng các lớp tiện ích để đọc ghi file.

Reflection trong C#

  • 6 min read

Reflection trong C# là gì? Ứng dụng của Reflection trong C#. Cách khai báo và sử dụng Reflection trong C#.

Attribute trong C#

  • 7 min read

Attribute trong C# là gì? Có những loại attribute nào trong C#? Làm sao để sử dụng attribute trong C#.