Phương thức (Methods) trong C#

0
2461

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

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

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

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

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

Sau đây là các yếu tố khác nhau của một phương thức:

  • Access Specifier: Điều này xác định tầm nhìn của một biến hoặc một phương pháp từ một lớp khác.
  • Kiể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ị phương thức trả về. Nếu phương thức này không trả lại bất kỳ giá trị nào thì kiểu trả về là void .
  • Tên phương thức: tên phương thức là một định danh duy nhất. Nó không thể được giống như bất kỳ định danh khác khai báo trong lớp.
  • Danh sách tham số: Kèm theo giữa dấu ngoặc đơn, các tham số được sử dụng để truyền và nhận dữ liệu từ một phương thức. Danh sách tham số dùng để chỉ loại, trật tự, và số lượng các them số của một phương pháp. Tham số là tùy chọn; đó là một phương thức có thể không có tham số.
  • Thân Phương thức: chứa tập các lệnh cần thiết để hoàn thành các hoạt động cần thiết.

Ví dụ:

Đoạn mã sau đây có tham số truyền vào là hai giá trị số nguyên và trả về số lớn hơn trong hai số đó. Nó được khai báo public, do đó ta ó thể truy cập nó từ bên ngoài lớp thông qua một thể hiện nào đó.

class NumberManipulator
{
   public int FindMax(int num1, int num2)
   {
      /* khai báo biến */
      int result;

      if (num1 > num2)
         result = num1;
      else
         result = num2;

      return result;
   }
   ...
}
  1. Gọi phương thức

Để gọi phương thức ta sử dụng tên của phương thức đó. Ví dụ:

using System;
namespace CalculatorApplication
{
   class NumberManipulator
   {
      public int FindMax(int num1, int num2)
      {
         int result;
         
         if (num1 > num2)
            result = num1;
         else
            result = num2;
         return result;
      }
      static void Main(string[] args)
      {
         int a = 100;
         int b = 200;
         int ret;
         NumberManipulator n = new NumberManipulator();

         //gọi phương thức FindMax
         ret = n.FindMax(a, b);
         Console.WriteLine("Max value is : {0}", ret );
         Console.ReadLine();
      }
   }
}

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

using System;
namespace CalculatorApplication
{
   class NumberManipulator
   {
      public int FindMax(int num1, int num2)
      {
         int result;
         
         if(num1 > num2)
            result = num1;
         else
            result = num2;
         
         return result;
      }
   }
   
   class Test
   {
      static void Main(string[] args)
      {
         int a = 100;
         int b = 200;
         int ret;
         NumberManipulator n = new NumberManipulator();
         
         //Gọi phương thức FindMax
         ret = n.FindMax(a, b);
         Console.WriteLine("Max value is : {0}", ret );
         Console.ReadLine();
      }
   }
}
  1. Gọi đệ quy phương thức

Một phương pháp 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 giai thừa cho một số bằng cách sử dụng một hàm đệ 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();
         //Gọi phương thức factorial
         Console.WriteLine("Factorial of 6 is : {0}", n.factorial(6));
         Console.WriteLine("Factorial of 7 is : {0}", n.factorial(7));
         Console.WriteLine("Factorial of 8 is : {0}", n.factorial(8));
         Console.ReadLine();
      }
   }
}
  1. Truyền tham số cho phương thức

Khi gọi phương thức có tham số, ta cần truyền tham số cho phương thức. có 3 cách:

Tham số kiểu giá trị:

Phương pháp này sẽ copy các giá trị thực tế của một đối số vào các tham số hình thức của hàm. Trong trường hợp này, những thay đổi của các tham số bên trong các hàm không có tác dụng làm thay đổi đối số.

Đâ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 thì một vị trí lưu trữ mới được tạo ra cho mỗi tham số giá trị.

Các giá trị của các tham số thực tế sẽ được sao chép vào chúng. Do đó, những thay đổi làm cho các tham số bên trong phương thức này không có hiệu lực trên các đối số. Ví dụ dưới đây trình bày các khái niệm:

using System;
namespace CalculatorApplication
{
   class NumberManipulator
   {
      public void swap(int x, int y)
      {
         int temp;
         
         temp = x; /* Lưu lại giá trị của x */
         x = y;    /* gán giá trị y cho x */
         y = temp; /* gán giá trị temp trở lại y */
      }
      
      static void Main(string[] args)
      {
         NumberManipulator n = new NumberManipulator();
         /* khai báo biến cục bộ */
         int a = 100;
         int b = 200;
         
         Console.WriteLine("Before swap, value of a : {0}", a);
         Console.WriteLine("Before swap, value of b : {0}", b);
         
         /* gọi phương thức swap */
         n.swap(a, b);
         
         Console.WriteLine("After swap, value of a : {0}", a);
         Console.WriteLine("After swap, value of b : {0}", b);
         
         Console.ReadLine();
      }
   }
}

Chương trình trên không gây ra sự hoán đổi giá trị của 2 biến a,b

Tham số kiểu tham chiếu:

Phương pháp này sẽ copy bản tham chiếu vị trí bộ nhớ của một đối số vào các tham số chính thức. Điều này có nghĩa rằng những thay đổi trên các tham số sẽ ảnh hưởng đến các đối số.

Một tham số tham chiếu là một tham chiếu đến một vị trí bộ nhớ của một biến. Khi truyền tham số tham chiếu, không giống như các tham số giá trị, một vị trí lưu trữ mới không được tạo ra cho các thông số này. Các tham số tham chiếu đại diện cho vị trí bộ nhớ tương tự như các tham số thực tế được cung cấp cho các phương thức.

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 chứng tỏ điều này:

using System;
namespace CalculatorApplication
{
   class NumberManipulator
   {
      public void swap(ref int x, ref int y)
      {
         int temp;

         temp = x; /* lưu giá trị x */
         x = y;    /* truyền giá trị y cho x */
         y = temp; /* truyền giá trị temo vào lại y */
      }
   
      static void Main(string[] args)
      {
         NumberManipulator n = new NumberManipulator();
         
         /* Khai báo biến cục bộ */
         int a = 100;
         int b = 200;

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

         /* gọi phương thức swap */
         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();

      }
   }
}

Chương trình trên làm cho giá trị a và b đổi cho nhau. Nó cho thấy rằng các giá trị đã thay đổi bên trong phương thức swap và sự thay đổi này phản ánh trong hàm Main()

Tham số đầu ra:

Phương pháp này giúp trong việc trả về nhiều hơn một giá trị.

Một lệnh return có thể được sử dụng để trả về chỉ một giá trị từ một hàm. Tuy nhiên, sử dụng các thông số đầu ra , bạn có thể trả lại hai giá trị từ một hàm. Tham số đầu ra tương tự như tham số tham chiếu, ngoại trừ việc nó chuyển dữ liệu ra các phương thức hơn là nhận vào nó.

Ví dụ:

using System;
namespace CalculatorApplication
{
   class NumberManipulator
   {
      public void getValue(out int x )
      {
         int temp = 5;
         x = temp;
      }
   
      static void Main(string[] args)
      {
         NumberManipulator n = new NumberManipulator();
         
         /* Khai báo biến cục bộ*/
         int a = 100;
         
         Console.WriteLine("Before method call, value of a : {0}", a);
         
         /* gọi phương thức*/
         n.getValue(out a);

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

      }
   }
}

Các biến được cung cấp cho các tham số đầu ra không cần phải được chỉ định một giá trị. các tham số đầu ra là đặc biệt hữu ích khi bạn cần phải trả lại giá trị từ một phương thức thông qua các tham số mà không gán giá trị ban đầu cho các tham số. Ví dụ sau giúp ta thấy rõ điều này:

using System;
namespace CalculatorApplication
{
   class NumberManipulator
   {
      public void getValues(out int x, out int y )
      {
          Console.WriteLine("Enter the first value: ");
          x = Convert.ToInt32(Console.ReadLine());
          Console.WriteLine("Enter the second value: ");
          y = Convert.ToInt32(Console.ReadLine());
      }
      static void Main(string[] args)
      {
         NumberManipulator n = new NumberManipulator();
         
         /* Khai báo biến cục bộ */
         int a , b;
         
         /* gọi phương thức */
         n.getValues(out a, out b);
         
         Console.WriteLine("After method call, value of a : {0}", a);
         Console.WriteLine("After method call, value of b : {0}", b);
         Console.ReadLine();
      }
   }
}

Chúc các bạn thành công!

This site uses Akismet to reduce spam. Learn how your comment data is processed.