Cấu trúc của hàm cơ bản trong C#

Khóa học lập trình C# căn bản

5.0 (8 đánh giá)
Tạo bởi Trần Thành Vi Thanh Cập nhật lần cuối 23:20 20-07-2020 199.071 lượt xem 19 bình luận
Tác giả/Dịch giả: Trần Thành Vi Thanh
Học nhanh

Danh sách bài học

Cấu trúc của hàm cơ bản trong C#

Dẫn nhập

Ở các bài học trước, chúng ta đã cùng nhau tìm hiểu về các CẤU TRÚC VÒNG LẶP TRONG C#. Trong quá trình viết code, chúng ta thường thấy code của mình quá dài, quá rườm rà, khó khăn cho việc tái sử dụng lại. Để giải quyết vấn đề này, chúng ta sẽ cùng nhau tìm hiểu về hàm trong C#.


Nội dung

Để đọc hiểu bài này tốt nhất các bạn nên có kiến thức cơ bản về các phần:

Trong bài học này, chúng ta sẽ cùng tìm hiểu các vấn đề:

  • Cấu trúc của hàm trong C#

Cấu trúc của hàm trong C#           

Cú pháp khai báo hàm:          

[Từ khóa 1] [Từ khóa 2] [Từ khóa n]  <Kiểu dữ liệu trả về> <Tên hàm>([Parameter]){ }

Trong đó:

  •  [Từ khóa 1], [Từ khóa 2], [Từ khóa n] là các từ khóa như: public, static, read only … và có thể không điền.
  •  Kiểu dữ liệu trả về như: từ khóa void, hay mọi kiểu dữ liệu như int, long, bool, SinhVien
  •  Tên hàm:
    • Là tên gọi của hàm.
    • Tên bạn có thể đặt tùy ý nhưng nên đặt tên theo quy tắc đặt tên để có sự đồng bộ ngầm định giữa các lập trình viên và dễ tìm, dễ nhớ (xem lại quy tắc đặt tên ở bài BIẾN TRONG C#).
    • Hãy xem cách khởi tạo hàm giống khởi tạo một biến ở chỗ. Đều cần kiểu dữ liệu và tên. Có thể có các từ khóa. Tên để tái sử dụng hàm ở nơi mong muốn.
  • Parameter là tham số truyền vào để sử dụng nội bộ trong hàm. Cấu trúc khởi tạo như một biến bình thường. Có thể không điền.
  • Hàm chỉ được khai báo bên trong class.

Lưu ý:

  • Mọi hàm đều phải có cặp ngoặc nhọn { } biểu thị là một khối lệnh. Mọi dòng code xử lý của hàm đều được viết bên trong cặp ngoặc nhọn { } này.
  • Không thể khai báo một hàm trong một hàm khác theo cách thông thường.

Một hàm cơ bản hay thấy với cấu trúc bắt buộc phải có trong lập trình C# console hàm Main

static void Main(string[] args)

        {

                   }

Trong đó:

  •  static là từ khóa static (sẽ tìm hiểu kỹ hơn ở bài sau). Có thể không sử dụng cũng được. Nhưng ở trường hợp hàm Main của console C# thì phải có.
  •  void là kiểu trả về. Với hàm có kiểu trả về là void thì sẽ không cần từ khóa return trong hàm. Hoặc có nhưng chỉ đơn giản là ghi return;
  •  Main là tên hàm. Có thể đặt tùy ý. Nhưng ở trường hợp này là bắt buộc phải là Main vì mỗi chương trình console C# đều cần hàm Main.
  •  string[] argsparameter truyền từ bên ngoài vào để sử dụng hàm. Có thể không có cũng được. nhưng ở trường hợp hàm Main của console C# là bắt buộc phải có. Ở đây có thể thay thế tên args bằng bất cứ tên nào khác như đặt tên một biến bình thường.

Hàm void

Hàm void là hàm có kiểu trả về là void. Chúng ta cùng xem qua khai báo hàm sau:

void Demo()

        {

            // some code

return;

        }

  •  Vì hàm void (hàm có kiểu trả về là void) thì không cần viết return; nên chúng ta có thể bỏ return; đi.

void Demo()

        {

            // some code

        }

Một lưu ý về sau: vì chúng ta đang viết code trên nền console C#. Bắt buộc phải có hàm Main. Nhưng hàm Main lại có từ khóa static. Nên để trong hàm Main có thể sử dụng các hàm mà ta viết ra thì các hàm đó cũng phải có từ khóa static.

static void Main(string[] args)
        {
            // Gọi lại hàm để sử dụng
            Demo();
            Console.ReadKey();
        }

        static void Demo()
        {
            Console.WriteLine("Called from Demo! HowKteam.com");
        }

  • Kết quả vẫn xuất ra dòng chữ "Called from Demo! HowKteam.com" như được viết bên trong hàm Main. Nhưng thật sự nó đã được gọi từ hàm Demo.

Cấu trúc của hàm cơ bản trong C#, C# cơ bản, tự học C#, Kteam, HowKteam

  •  Khi sử dụng hàm ta sẽ gọi lại tên hàm kèm theo dấu () biểu thị đó là một hàm. Sau này nếu có parameter thì sẽ thêm giá trị vào bên trong dấu ().
  • Chúng ta có thể gọi lại nhiều lần và có thể thấy code chúng ta viết rất rõ ràng và rất dễ tái sử dụng.
static void Main(string[] args)
        {
            // Gọi lại hàm nhiều lần
            // dòng chữ Called from Demo! HowKteam.com cũng được in ra nhiều lần
            Demo();
            Demo();
            Demo();
            Demo();
            Console.ReadKey();
        }

        static void Demo()
        {
            Console.WriteLine("Called from Demo! HowKteam.com");
        }

Nhiều dòng chữ "Called from Demo! HowKteam.com" được in ra màn hình

Cấu trúc của hàm cơ bản trong C#, C# cơ bản, tự học C#, Kteam, HowKteam


Hàm có kiểu trả về khác void

Với hàm có kiểu trả về khác void. Trong thân hàm bắt buộc phải có dòng return <Giá trị trả về>;

Giá trị trả về phải có kiểu dữ liệu tương ứng với Kiểu dữ liệu trả về khi khai báo hàm.

  /// <summary>
        /// Hàm trả về giá trị số nguyên 5 thông qua tên hàm
        /// Lưu ý giá trị trả về phải cùng kiểu dữ liệu với kiểu trả về của hàm
        /// Ở đây là kiểu int
        /// </summary>
        /// <returns></returns>
        static int ReturnANumber()
        {
            // bắt buộc phải có cấu trúc return trong thân hàm
            return 5;
        }

   

Chúng ta có thể sử dụng hàm này bình thường. Và có thêm một lợi thế là có thể lấy giá trị trả về của hàm thông qua lời gọi tên hàm.

static void Main(string[] args)
        {
            Console.WriteLine(ReturnANumber());
            Console.ReadKey();
        }
       
        /// <summary>
        /// Hàm trả về giá trị số nguyên 5 thông qua tên hàm
        /// Lưu ý giá trị trả về phải cùng kiểu dữ liệu với kiểu trả về của hàm
        /// Ở đây là kiểu int
        /// </summary>
        /// <returns></returns>

        static int ReturnANumber()
        {
            // bắt buộc phải có cấu trúc return trong thân hàm
            return 5;
        }

Kết quả số 5 xuất hiện trên màn hình

Cấu trúc của hàm cơ bản trong C#, C# cơ bản, tự học C#, Kteam, HowKteam

Chúng ta có thể gọi hàm trong hàm như sau: (để hiểu về trình tự gọi hàm các bạn có thể xem lại phần ví dụ của bài NHẬP XUẤT CONSOLE CƠ BẢN TRONG C#)

static void Main(string[] args)
        {
            Demo();
            Console.ReadKey();
        }
      

        /// <summary>
        /// Hàm trả về giá trị số nguyên 5 thông qua tên hàm
        /// Lưu ý giá trị trả về phải cùng kiểu dữ liệu với kiểu trả về của hàm
        /// Ở đây là kiểu int
        /// </summary>
        /// <returns></returns>

        static int ReturnANumber()
        {
            // bắt buộc phải có cấu trúc return trong thân hàm
            return 5;
        }

        /// <summary>
        /// in ra màn hình một giá trị nào đó
        /// </summary>

        static void Demo()
        {
         // trong hàm Demo gọi lại hàm ReturnANumber
            Console.WriteLine(ReturnANumber());
        }

Kết quả vẫn là số 5 được in ra màn hình

Cấu trúc của hàm cơ bản trong C#, C# cơ bản, tự học C#, Kteam, HowKteam


Parametter

Chúng ta đã biết cách khởi tạo và sử dụng một hàm. Vậy giờ có một yêu cầu như sau: Viết hàm tính tổng 2 số nguyên.

  •  Chúng ta có thể sử dụng biến toàn cục (sẽ được nói rõ ở bài sau) để giải quyết:
static void Main(string[] args)
        {
            Console.WriteLine(SumTwoNumber());
            Console.ReadKey();
        }


        /// <summary>
        ///  hai biến firstNumber và secondNumber hiện là biến toàn cục của các hàm nằm bên trong class Program nhưng lại là biến cục bộ của class Program
        ///  Cần có từ khóa static vì các hàm sử dụng nó đều có từ khóa static
        /// </summary>

        static int firstNumber = 5;
        static int secondNumber = 10;
             

        /// <summary>
        /// hàm trả ra kết quả tổng của 2 số firstNumber và secondNumber
        /// </summary>
        /// <returns></returns>

        static int SumTwoNumber()
        {
            return firstNumber + secondNumber;
        }

Kết quả màn hình xuất ra giá trị tổng của hai biến firstNumber secondNumber. 5 + 10 = 15

Cấu trúc của hàm cơ bản trong C#, C# cơ bản, tự học C#, Kteam, HowKteam

Nhưng khi dùng phương pháp như vậy rõ là khá phiền phức khi muốn in ra màn hình tổng của hai số một cách linh hoạt. Hay muốn thực hiện tính tổng hai số nhiều lần. Để tạo sự linh hoạt cho hàm thì chúng ta sẽ tìm hiểu thêm về parameter:

  •  Có thể hiểu đơn giản parametter
    • Tập hợp một hay nhiều biến chứa các giá trị cần thiết để thao tác trong hàm.
    • Các giá trị của các biến này là những giá trị mà người dùng truyền vào khi gọi hàm đó.
    • Khai báo một parametter cũng giống như khai báo biến (xem lại bài BIẾN TRONG C#). Khi khai báo nhiều parametter thì các khai báo phải cách nhau bởi dấu “,”

 Trở lại bài toán trên. Chúng ta muốn 2 số cần tính tổng này là 2 số do người dùng quyết định, 2 số này không cố định. Vì thế ta nảy sinh ý tưởng:

  • Cho người dùng truyền vào 2 số họ muốn tính tổng vào 2 biến.
  • Từ đó ta chỉ cần tính tổng giá trị 2 biến đó rồi trả kết quả về cho người dùng.

 Các bạn xem qua ví dụ sau:

static void Main(string[] args)
        {

            // khi sử dụng hàm phải truyền đúng số lượng, thứ tự parameter vào như khai báo của hàm
            // đồng thời kiểu dữ liệu truyền vào của parameter phải trùng khớp với khai báo của hàm

            Console.WriteLine(SumTwoNumber(5, 10));
            Console.ReadKey();
        }               
             

        /// <summary>
        /// hàm trả ra kết quả tổng của 2 số firstNumber và secondNumber
        /// </summary>

        /// <param name="firstNumber"></param>
        /// <param name="secondNumber"></param>
        /// <returns></returns>

        static int SumTwoNumber(int firstNumber, int secondNumber)
        {
            return firstNumber + secondNumber;
        }

Kết quả màn hình vẫn in ra giá trị 15.

Cấu trúc của hàm cơ bản trong C#, C# cơ bản, tự học C#, Kteam, HowKteam

  • Các khai báo int firstNumber, int secondNumber là các khai báo parametter. Với khai báo này ta hiểu rằng muốn sử dụng hàm này thì cần truyền vào 2 giá trị kiểu int.
  • Các parametter được xem như các biến cục bộ có phạm vị sử dụng trong hàm (biến cục bộ sẽ được trình bày ở bài sau).
  • Các parametter được khởi tạo ngay khi gọi hàm và được hủy khi kết thúc gọi hàm.
  • Số lượng parameter không giới hạn.
  • Khi sử dụng hàm phải truyền vào đủ và đúng parameter. (Đủ số lượng, đúng kiểu dữ liệu và đúng thứ tự như khai báo)
  • Có thể khai báo các parameter với các kiểu dữ liệu khác nhau.
  • Hàm sử dụng sẽ tạo ra các bản sao của parameter truyền vào trên RAM. Sau đó dùng những bản sao đó để xử lý dữ liệu. Cho nên kết thúc lời gọi hàm giá trị của các parameter sẽ không bị thay đổi.

 Cùng xét thêm một ví dụ nữa nào:

static void Main(string[] args)
        {
            int firstNum = 0;
            int secondNum = 3;


            // in ra màn hình 10 lần tổng 2 số
            for (int count = 0; count < 10; count++)
            {
                // in ra màn hình tổng của 2 số
                PrintSumTwoNumber(firstNum, secondNum);


                // tính toán để tạo ra 2 số mới. Không quan trọng lắm
                firstNum += count;
                secondNum += count * 2 % 5;
            }

            Console.ReadKey();
        }
       

        /// <summary>
        /// In ra màn hình tổng của 2 số
        /// </summary>
        /// <param name="firstNumber"></param>
        /// <param name="secondNumber"></param>

        static void PrintSumTwoNumber(int firstNumber, int secondNumber)
        {
            Console.WriteLine("{0} + {1} = {2}",firstNumber, secondNumber, SumTwoNumber(firstNumber, secondNumber));
        }   

        /// <summary>
        /// hàm trả ra kết quả tổng của 2 số firstNumber và secondNumber
        /// </summary>
        /// <param name="firstNumber"></param>
        /// <param name="secondNumber"></param>
        /// <returns></returns>

        static int SumTwoNumber(int firstNumber, int secondNumber)
        {
            return firstNumber + secondNumber;
        }

Kết quả màn hình xuất ra 10 giá trị tổng của 2 số

Cấu trúc của hàm cơ bản trong C#, C# cơ bản, tự học C#, Kteam, HowKteam

  •  Ví dụ về các parameter với kiểu dữ liệu khác nhau
static void Main(string[] args)
        {
            PrintSomeThing("K9", 22);
            PrintSomeThing("HowKteam.com", 1);
            Console.ReadKey();
        }

    
        static void PrintSomeThing(string name, int age)
        {
            // in ra màn hình tên và tuổi được truyền vào
            Console.WriteLine("This is {0}, {1} years old.", name, age);
        }

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

Cấu trúc của hàm cơ bản trong C#, C# cơ bản, tự học C#, Kteam, HowKteam

  •  Nếu không sử dụng parametter trong hàm thì không nên khai báo parametter để tránh lãng phí bộ nhớ!

Kết luận

Qua bài này chúng ta đã nắm được hàm là gì, cách sử dụng hàm.

Bài sau chúng ta sẽ tìm hiểu về BIẾN TOÀN CỤC VÀ BIẾN CỤC BỘ TRONG C#.

Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.


Tải xuống

Tài liệu

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Cấu trúc của hàm cơ bản trong C# dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên likeshare để ủng hộ Kteam và tác giả nhé!


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.

Nội dung bài viết

Tác giả/Dịch giả

Mỗi buổi sáng thức dậy, bạn có 2 lựa chọn, tiếp tục ngủ để mơ những giấc mơ hoặc thức dậy và theo đuổi chúng!

Khóa học

Khóa học lập trình C# căn bản

Bạn mới bắt đầu học lập trình? Bạn đang muốn học thêm ngôn ngữ lập trình mới? C# là lựa chọn hoàn hảo để đáp ứng các nhu cầu trên.

Ngôn ngữ C# là một ngôn ngữ mới, cấu trúc rõ ràng, dễ hiểu và dễ học. C# thừa hưởng những ưu việt từ ngôn ngữ Java, C, C++ cũng như khắc phục được những hạn chế của các ngôn ngữ này. C# là ngôn ngữ lập trình hướng đối tượng được phát triển bởi Microsoft, được xây dựng dựa trên C++ và Java.

Khoá học lần này sẽ mang đến toàn bộ những kiến thức cơ bản về C#. Chào mừng các bạn đã đến với khoá học LẬP TRÌNH C# CƠ BẢN của Kteam.

Đánh giá

dang2203 đã đánh giá 13:08 06-04-2024

20116191 đã đánh giá 16:53 02-01-2024

Chiến Bình đã đánh giá 08:21 20-07-2023

Sao bài này nó cứ ngược ngược,không viết theo kiểu từ trên xuống dưới được à ad.em thắc mắc

quangnt1234 đã đánh giá 15:57 15-04-2023

Stick1337 đã đánh giá 15:36 04-06-2021

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
Duccter đã bình luận 16:18 28-07-2023

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace A14_Ham
{
    internal class Program
    {
        // chuong trinh tinh a^b % c
        static void Main(string[] args)
        {
            long a, b, c;
            string input = Console.ReadLine();

            // Tách chuỗi thành các giá trị riêng biệt
            string[] values = input.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

            a = Convert.ToInt64(values[0]);
            b = Convert.ToInt64(values[1]);
            c = Convert.ToInt64(values[2]);

            Console.WriteLine(Tach(a, b, c));
            //Console.ReadKey();
        }

        static long Tach(long so, long soMu, long soChia)
        {
            if (soMu == 1) return so;

            long daTach = Tach(so, soMu / 2, soChia) ;
            daTach = (daTach * daTach) % soChia;
            if (soMu % 2 == 0) return daTach;
            else return (daTach * (so % soChia)) % soChia;
        }
    }
}
 

quangnt1234 đã bình luận 15:01 17-04-2023

        

namespace danh_sach_so_nguyen_to
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int a;
            bool check = int.TryParse(Console.ReadLine(), out a);
            if (check==false|| a <= 1)
            {
                Console.WriteLine("error");
            }
            else
            {
                for(int k = 2; k < a; k++)
                {
                    
                    if (Prime_Num(k) != 0)
                    {
                        Console.Write(Prime_Num(k) + " ");
                    }
                }
            }
            static int Prime_Num(int i)
            {
                int j = 0;
                int s = (int)(Math.Sqrt(i));
                if (i == 2 || i == 3)
                {
                    j = i;
                }
                else
                {
                    for(int m = 2; m <= s; m++)
                    {

                        if (i % m == 0)
                        {
                            j = 0;
                            break;
                        }
                        else
                        {
                            j = i;
                        }
                    }
                }
                return j;
            }
        }
    }
}


 

vuquang1102 đã bình luận 20:11 17-09-2022

using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Ham
{

    class program
    {
        static void Main(string[] args)
        {
            int a;
            int b;

            while((int.TryParse(Console.ReadLine(), out a)) == false)
            {
                Console.WriteLine("Ban da nhap sai, xin moi nhap lai:");               
            }

            while((int.TryParse(Console.ReadLine(), out b)) == false)
            {
                Console.WriteLine("Ban da nhap sai, xin moi nhap lai:");
            }
            TongHieutichthuongab(a,b);
        }

        static void TongHieutichthuongab(int a, float b)
        {
            Console.WriteLine("Tong hai so:" + (a + b));
            Console.WriteLine("Tong hai so:" + (a - b));
            Console.WriteLine("Tong Tich so:" + a * b);
            Console.WriteLine("Tong Thuong so:" + a / b);
            sosanh(a, b);


        }
            
        static void sosanh (int a, float b)
        {
            if (a > b)
            {
                Console.WriteLine ("{0} > {1}", a, b);
            }
            else
            {
                Console.WriteLine ("{0} > {1}", b, a);
            }
           


        }
            

    }

}

Stick1337 đã bình luận 15:35 04-06-2021

static void Main(string[] args)
        {
            kiemtra:
            int a, b;
            Console.WriteLine(" Nhap a");
            
            
            
            bool check = int.TryParse(Console.ReadLine(), out a);
            Console.WriteLine(" Nhap b");
            bool check1 = int.TryParse(Console.ReadLine(), out b);
            if (check == false || check1 == false)
            {
                Console.WriteLine(" Ban da nhap a hoac b sai vui long nhap lai!");
                goto kiemtra;
            }
            else if (check == true && check1 == true)
            {
                pro:
                Console.WriteLine(" Nhap lua chon cua ban 1: Tinh tong \n 2: Tinh hieu");
                int choice = int.Parse(Console.ReadLine());
                if (choice == 1)
                {
                    Console.WriteLine("A+B={0}", tong(a, b));
                }
                else if (choice == 2)
                {
                    Console.WriteLine("A-B={0}", hieu(a, b));
                }
                else
                {
                    Console.WriteLine(" Ban da nhap sai vui long nhap lai");
                    goto pro;
                }
            }

        }
        static int tong(int a,int b)
        {
            return a + b;
        }
        static int hieu(int a, int b)
        {
            return a - b;
        }

theoriginal đã bình luận 00:27 22-02-2021

Tính tổng số nguyên a,b nhập từ bàn phím. Có kiểm tra giá trị a,b nhập từ bàn phím là int hay string! Nhập sai thì yêu cầu nhập lại bằng vòng lặp!


        static void Main(string[] args)
        {
            int a;
            Console.Write("Nhap a = ");
            
            kiemtraA:
            bool kiemtra1 = int.TryParse(Console.ReadLine(), out a);
            while (kiemtra1 == false)
            {
                Console.WriteLine("Nhap a sai! Moi ban nhap lai a!");
                Console.Write("Nhap a = ");
                goto kiemtraA;
            }    
            Console.Write("Nhap b = ");
            
            kiemtraB:
            int b;
            bool kiemtra2 = int.TryParse(Console.ReadLine(), out b);
            while (kiemtra2 == false)
            {
                Console.WriteLine("Nhap b sai! Moi ban nhap lai b!");
                Console.Write("Nhap b = ");
                goto kiemtraB;
            }
            Console.WriteLine("========================");
            Console.WriteLine("a + b = {0} + {1} = {2}",a,b,sum(a,b));
            Console.ReadKey();
        }

        static int sum(int firstNumber, int secondNumber)
        {
            return firstNumber + secondNumber;
        }
Không có video.