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 trong C#

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

  (danh_sách_tham_số)
{
   phần thân phương thức
}

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

  • Access Specifier: Định nghĩa tính nhìn thấy của một biến hoặc một phương thức với 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ị 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.
  • tên_phương_thức: Tên phương thức là một định danh duy nhất và nó là phân biệt kiểu chữ. Nó không thể giống bất kỳ định danh nào khác đã được khai báo trong lớp đó.
  • danh_sách_tham_số: 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.
  • phần thân phương thức: Phần thân phương thức chứa tập hợp các chỉ thị cần thiết để hoàn thành hoạt động đã yêu cầu.

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ó Access Specifier, vì thế nó có thể được truy cập từ bên ngoài lớp bởi sử dụng một Instance (sự thể hiện) của lớp đó.

using System;


namespace HoclaptrinhCsharp
{
    class TestCsharp
    {
       public int FindMax(int num1, int num2)
       {
          /* khai bao bien cuc bo */
          int result;


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


          return result;
       }
       ...
    }
}

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

Bạn có thể gọi một phương thức bởi 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 HoclaptrinhCsharp
{
    class TestCsharp
    {
        public int FindMax(int num1, int num2)
        {
            /* khai bao bien cuc bo */
            int result;


            if (num1 > num2)
                result = num1;
            else
                result = num2;
            return result;
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Goi phuong thuc trong C#");
            Console.WriteLine("--------------------------");
            /* phan dinh nghia bien cuc bo  */
            int a = 100;
            int b = 200;
            int ret;
            TestCsharp n = new TestCsharp();


            //goi phuong thuc FindMax
            ret = n.FindMax(a, b);
            Console.WriteLine("Gia tri lon nhat la: {0}", ret);
            Console.ReadLine();


            Console.ReadKey();
        }
    }
}

Nếu bạn không sử dụng lệnh Console.ReadKey(); thì chương trình sẽ chạy và kết thúc luôn (nhanh quá đến nỗi bạn không kịp nhìn kết quả). Lệnh này cho phép chúng ta nhìn kết quả một cách rõ ràng hơn.

Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

Phương thức trong C# 1

Bạn cũng có thể gọi phương thức public từ các lớp khác bằng việc sử dụng Instance (sự thể hiện) của lớp đó. Ví dụ, phương thức FindMax thuộc lớp UngDungToan, bạn có thể gọi nó từ lớp TestCsharp.

Tạo hai lớp có tên lần lượt là UngDungToanTestCsharp có nội dung như sau:

Lớp UngDungToan: chứa phương thức cần gọi

using System;


namespace HoclaptrinhCsharp
{
    class UngDungToan
    {
        public int FindMax(int num1, int num2)
        {
            /* khai bao bien cuc bo */
            int result;


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


            return result;
        }
    }
}

Lớp TestCsharp: chứa phương thức main().

using System;


namespace HoclaptrinhCsharp
{
    class TestCsharp
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Goi phuong thuc trong C#");
            Console.WriteLine("Goi phuong thuc thong qua instance cua lop");
            Console.WriteLine("--------------------------------------------");
            /* phan dinh nghia bien cuc bo  */
            int a = 100;
            int b = 200;
            int ret;


            //tao doi tuong UngDungToan
            UngDungToan n = new UngDungToan();


            //goi phuong thuc FindMax
            ret = n.FindMax(a, b);
            Console.WriteLine("Gia tri lon nhat la: {0}", ret);
            Console.ReadLine();
        }
    }
}

Nếu bạn không sử dụng lệnh Console.ReadKey(); thì chương trình sẽ chạy và kết thúc luôn (nhanh quá đến nỗi bạn không kịp nhìn kết quả). Lệnh này cho phép chúng ta nhìn kết quả một cách rõ ràng hơn.

Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

Phương thức trong C# 2

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

Một phương thức có thể gọi chính nó. Điều này được biết đến là đệ qui. Ví dụ sau tính toán giai thừa của số đã cho bởi sử dụng một hàm đệ qui trong C#:

using System;


namespace HoclaptrinhCsharp
{
    class TestCsharp
    {
        public int TinhGiaiThua(int num)
        {
            /* khai bao bien cuc bo */
            int result;
            if (num == 1)
            {
                return 1;
            }
            else
            {
                result = TinhGiaiThua(num - 1) * num;
                return result;
            }
        }


        static void Main(string[] args)
        {
            Console.WriteLine("Goi phuong thuc trong C#");
            Console.WriteLine("Tinh giai thua trong C#");
            Console.WriteLine("--------------------------");


            TestCsharp n = new TestCsharp();
            //goi phuong thuc 
            Console.WriteLine("6! = {0}", n.TinhGiaiThua(6));
            Console.WriteLine("7! = {0}", n.TinhGiaiThua(7));
            Console.WriteLine("8! = {0}", n.TinhGiaiThua(8));
            Console.ReadLine();


            Console.ReadKey();
        }
    }
}

Nếu bạn không sử dụng lệnh Console.ReadKey(); thì chương trình sẽ chạy và kết thúc luôn (nhanh quá đến nỗi bạn không kịp nhìn kết quả). Lệnh này cho phép chúng ta nhìn kết quả một cách rõ ràng hơn.

Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

Phương thức trong C# 3

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

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

Kỹ thuậtMiêu tả

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

Phương thức này 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ố đó

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

Phương thức này 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ố đó

Truyền tham số bởi output trong C#

Phương thức này giúp ích khi trả về nhiều hơn một giá trị

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

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

Các giá trị của các tham số thực sự được sao chép vào trong chúng. Vì thế, các thay đổi được tạo ra với các tham số bên trong phương thức không có ảnh hưởng gì tới các tham số chính thức. Ví dụ sau minh họa khái niệm này.

using System;


namespace HoclaptrinhCsharp
{
    class TestCsharp
    {
        public void swap(int x, int y)
        {
            int temp; //bien tam


            temp = x; /* luu giu gia tri x vao bien tam*/
            x = y;    /* dat gia tri cua y vao x */
            y = temp; /* dat gia tri cua temp vao y */
        }


        static void Main(string[] args)
        {
            Console.WriteLine("Truyen tham so boi gia tri trong C#");
            Console.WriteLine("Trao doi gia tri trong C#");
            Console.WriteLine("------------------------------------");
            //tao doi tuong TestCsharp
            TestCsharp n = new TestCsharp();
            /* phan dinh nghia bien cuc bo  */
            int a = 100;
            int b = 200;


            Console.WriteLine("Truoc khi trao doi, gia tri cua a la: {0}", a);
            Console.WriteLine("Truoc khi trao doi, gia tri cua b la: {0}", b);


            /* goi ham de trao doi gia tri */
            n.swap(a, b);


            Console.WriteLine("\nSau khi trao doi, gia tri cua a la: {0}", a);
            Console.WriteLine("Sau khi trao doi, gia tri cua b la: {0}", b);


            Console.ReadLine();
            Console.ReadKey();
        }
    }
}

Nếu bạn không sử dụng lệnh Console.ReadKey(); thì chương trình sẽ chạy và kết thúc luôn (nhanh quá đến nỗi bạn không kịp nhìn kết quả). Lệnh này cho phép chúng ta nhìn kết quả một cách rõ ràng hơn.

Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

Phương thức trong C# 4

Điều này chỉ ra rằng không có sự thay đổi trong các giá trị bởi vì chúng đã được thay đổi bên trong hàm.

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

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

Bạn có thể khai báo các tham số tham chiếu bởi sử dụng từ khóa ref trong C#. Ví dụ sau minh họa khái niệm này:

using System;


namespace HoclaptrinhCsharp
{
    class TestCsharp
    {
        public void swap(ref int x, ref int y)
        {
            int temp; //bien tam


            temp = x; /* luu giu gia tri cua x vao bien tam */
            x = y;    /* dat gia tri cua y vao x */
            y = temp; /* dat gia tri cua temp vao y */
        }


        static void Main(string[] args)
        {
            Console.WriteLine("Truyen tham so boi tham chieu trong C#");
            Console.WriteLine("Trao doi gia tri trong C#");
            Console.WriteLine("----------------------------------");
            //tao doi tuong TestCsharp
            TestCsharp n = new TestCsharp();


            /* phan dinh nghia bien cuc bo  */
            int a = 100;
            int b = 200;


            Console.WriteLine("Truoc khi trao doi, gia tri cua a la: {0}", a);
            Console.WriteLine("Truoc khi trao doi, gia tri cua b la: {0}", b);


            /* goi ham de trao doi gia tri */
            n.swap(ref a, ref b);


            Console.WriteLine("Sau khi trao doi, gia tri cua a la: {0}", a);
            Console.WriteLine("Sau khi trao doi, gia tri cua b la: {0}", b);


            Console.ReadLine();
            Console.ReadKey();
        }
    }
}

Phương thức trong C# 5

Điều này chỉ ra rằng các giá trị đã thay đổi bên trong hàm swap và điều này được phản ánh trong hàm Main.

Truyền tham số bởi output trong C#

Một lệnh return có thể được sử dụng để chỉ trả về một giá trị từ một hàm. Tuy nhiên, sử dụng các tham số output, bạn có thể trả về hai giá trị từ một hàm. Các tham số output là tương tự như các tham số tham chiếu, ngoại trừ chúng truyền dữ liệu ra khỏi phương thức thay vì vào trong nó.

Dưới đây là ví dụ minh họa tham số output trong C#:

using System;


namespace HoclaptrinhCsharp
{
    class TestCsharp
    {
        public void getValue(out int x)
        {
            int temp = 5;
            x = temp;
        }


        static void Main(string[] args)
        {
            Console.WriteLine("Truyen tham so boi output trong C#");
            Console.WriteLine("-------------------------------------");
            //tao doi tuong TestCsharp
            TestCsharp n = new TestCsharp();


            /* phan dinh nghia bien cuc bo  */
            int a = 100;


            Console.WriteLine("Truoc khi goi phuong thuc, gia tri cua a la: {0}", a);


            /* goi ham getValue() de lay gia tri */
            n.getValue(out a);


            Console.WriteLine("Sau khi goi phuong thuc, gia tri cua a la: {0}", a);
            Console.ReadLine();
            Console.ReadKey();
        }
    }
}

Nếu bạn không sử dụng lệnh Console.ReadKey(); thì chương trình sẽ chạy và kết thúc luôn (nhanh quá đến nỗi bạn không kịp nhìn kết quả). Lệnh này cho phép chúng ta nhìn kết quả một cách rõ ràng hơn.

Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

Phương thức trong C# 6

Biến được cung cấp cho tham số output không cần được gán một giá trị. Các tham số output là đặc biệt hữu ích khi bạn cần trả về các giá trị từ một phương thức thông qua các tham số đó mà không cần gán một giá trị khởi đầu cho tham số đó. Bạn xét ví dụ minh họa sau để hiểu khái niệm này trong C#:

using System;


namespace HoclaptrinhCsharp
{
    class TestCsharp
    {
        public void getValues(out int x, out int y)
        {
            Console.Write("Nhap gia tri thu nhat: ");
            x = Convert.ToInt32(Console.ReadLine());
            Console.Write("Nhap gia tri thu hai: ");
            y = Convert.ToInt32(Console.ReadLine());
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Truyen tham so boi output trong C#");
            Console.WriteLine("-------------------------------------\n");
            //tao doi tuong TestCsharp
            TestCsharp n = new TestCsharp();


            /* phan dinh nghia bien cuc bo  */
            int a, b;


            /* goi ham getValues() de lay gia tri */
            n.getValues(out a, out b);


            Console.WriteLine("Sau loi goi phuong thuc, gia tri cua a la: {0}", a);
            Console.WriteLine("Sau loi goi phuong thuc, gia tri cua b la: {0}", b);
            Console.ReadLine();
            Console.ReadKey();
        }
    }
}

Nếu bạn không sử dụng lệnh Console.ReadKey(); thì chương trình sẽ chạy và kết thúc luôn (nhanh quá đến nỗi bạn không kịp nhìn kết quả). Lệnh này cho phép chúng ta nhìn kết quả một cách rõ ràng hơn.

Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

Phương thức trong C# 7


Bình luận