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, tất cả chúng ta đã bên cạnh nhau khám phá về các CẤᑗ TRÚ₵ VÒNG LẶΡ TRONG ₵#. Trong tiến trình viết code, tất cả chúng ta thường thấy code của mình quá dài, quá rắc rối, khốn khó cho việc tái sử dụng lại. Để khắc phục vấn đề này, tất cả chúng ta sẽ bên cạnh nhau khám phá về hàm trong ₵#.

Bài viết

Để đọc hiểu bài này tốt nhất các chúng ta nên có học thức cơ bản về các phần:

Trong bài học này, tất cả chúng ta sẽ cùng khám phá các vấn đề:

  • Cấu trúc của

    hàm

    trong ₵#

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

       

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ềvàgt; <Tên hàm>([Parameter]){ }

Trong số đó:

  •  

    [Từ khóa 1], [Từ khóa 2], [Từ khóa n]

    là các keyword như:

    public

    ,

    static

    ,

    read only

    … & có thể không điền.

  •  

    Kiểu dữ liệu trả về

    như: keyword

    void,

    hay mọi kiểu dữ liệu như

    int, long, bool,

    SinhVien

  •  

    Tên hàm:

    • Là cái tên của

      hàm

      .

    • Tên bạn có thể đặt tùy ý nhưng nên đặt tên theo nguyên tắc đặt tên để có sự ăn khớp ngầm định giữa các lập trình viên & dễ tìm, dễ nhớ (xem lại nguyên tắc đặt tên ở bài

      BIẾɳ TRONG ₵#

      ).

    • 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 & tên. Có thể có các keyword. Tên để tái sử dụng

      hàm

      ở nơi mong mỏi.

  • 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 bình. Có thể không điền.

  • Hàm

    chỉ được khai báo bên trong

    class

    .

Chú ý:

  • Mọι

    hàm

    đều cần có cặp ngoặc nhọn {

    } biểu thị là một khối lệnh. Mọi dòng code giải quyết của hàm đều được viết bên trong cặp ngoặc nhọn {

    } này.

  • Chẳ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 cần có trong lập trình ₵# console hàm Main

static void Main(string[] args)

        {

                   }

Trong số đó:

  •  

    static

    là keyword static (

    sẽ khám phá 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 ₵# thì cần có.

  •  

    void

    là kiểu trả về. Với hàm có kiểu trả về là

    void

    thì sẽ không cần keyword

    return

    trong hàm. Hoặc có nhưng chỉ dễ dàng là ghi

    return

    ;

  •  

    Main

    là tên hàm. Có thể đặt tùy ý. Nhưng ở trường hợp đó là bắt buộc phải là

    Main

    vì mỗi chương trình console ₵# đều cần hàm

    Main

    .

  •  

    string

    []

    args

    parameter

    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 ₵# là bắt buộc cần có. Ở giai đoạn này có thể thay thế tên

    args

    bằng bất kể tên nào khác như đặt tên một biến bình bình.

Hàm void

Hàm void là hàm có kiểu trả về là void. Tất cả chúng ta cùng đọc qua khai báo hàm sau:

void Dùng thử()

        {

            // 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 tất cả chúng ta có thể bỏ

    return; đi.

void Dùng thử()

        {

            // some code

        }

Một chú ý về sau: vì tất cả chúng ta đang viết code trên nền console ₵#. Bắt buộc cần có hàm Main. Nhưng hàm Main lại có keyword 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 cần có keyword static.

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

        static void Dùng thử()
        {
            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

    Dùng thử

    .

  •  Khi sử dụng

    hàm

    ta sẽ gọi lại tên hàm kèm theo dấu () biểu thị này 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 ().

  • Tất cả chúng ta có thể gọi lại nhiều lần & có thể thấy code tất cả chúng ta viết rất cụ thể & rất đơn giản 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 Dùng thử! HowKteam.com cũng được in ra nhiều lần
            Dùng thử();
            Dùng thử();
            Dùng thử();
            Dùng thử();
            Console.ReadKey();
        }

        static void Dùng thử()
        {
            Console.WriteLine("Called from Demo! HowKteam.com");
        }

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

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 cần có dòng return <Giá trị trả vềvàgt;;

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

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

   

Tất cả chúng ta có thể sử dụng hàm này bình bình. & 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();
        }
       
        /// <summaryvàgt;
        /// Hàm trả về giá trị số nguyên 5 thông qua tên hàm
        /// Chú ý giá trị trả về phải cùng kiểu dữ liệu với kiểu trả về của hàm
        /// Ở giai đoạn này là kiểu int
        /// </summaryvàgt;
        /// <returnsvàgt;</returnsvàgt;

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

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

Tất cả 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 chẳng hạn của bài NHẬΡ XUẤƬ CONSOLE CƠ BẢɳ TRONG ₵#)

static void Main(string[] args)
        {
            Dùng thử();
            Console.ReadKey();
        }
      

        /// <summaryvàgt;
        /// Hàm trả về giá trị số nguyên 5 thông qua tên hàm
        /// Chú ý giá trị trả về phải cùng kiểu dữ liệu với kiểu trả về của hàm
        /// Ở giai đoạn này là kiểu int
        /// </summaryvàgt;
        /// <returnsvàgt;</returnsvàgt;

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

        /// <summaryvàgt;
        /// in ra màn hình một giá trị nào đó
        /// </summaryvàgt;

        static void Dùng thử()
        {
         // trong hàm Dùng thử 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

Parametter

Tất cả chúng ta đã biết phương pháp khởi tạo & 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.

  •  

    Tất cả chúng ta có thể sử dụng biến toàn cục (

    sẽ được nói rõ ở bài sau

    ) để khắc phục:

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


        /// <summaryvàgt;
        ///  hai biến firstNumber & 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 phải có keyword static vì các hàm sử dụng nó đều có keyword static
        /// </summaryvàgt;

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

        /// <summaryvàgt;
        /// hàm trả ra kết quả tổng của 2 số firstNumber & secondNumber
        /// </summaryvàgt;
        /// <returnsvàgt;</returnsvàgt;

        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

Nhưng khi dùng bí quyết như thế rõ là khá phiền toái khi mong muốn in ra màn hình tổng của hai số một cách linh động. Hay mong muốn thực hiện tính tổng hai số nhiều lần. Để tạo sự linh động cho hàm thì tất cả chúng ta sẽ xem thêm về parameter:

  •  

    Có thể hiểu dễ dàng

    parametter

    • Tập hợp một hay nhiều biến chứa các giá trị thiết yếu để thao tác trong hàm.

    • Các giá trị của các biến đó 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

      không khác gì như khai báo biến (xem lại bài

      BIẾɳ TRONG ₵#

      ). 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. Tất cả chúng ta mong muốn 2 số cần tính tổng đó là 2 số do người dùng quyết định, 2 số này không cố định. Chính vì thế ta nảy sinh sáng kiến:

  • Cho người dùng truyền vào 2 số họ mong 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 đọc qua chẳng hạn 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
            // song song 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();
        }               
             

        /// <summaryvàgt;
        /// hàm trả ra kết quả tổng của 2 số firstNumber & secondNumber
        /// </summaryvàgt;

        /// <param name="firstNumber"></paramvàgt;
        /// <param name="secondNumber"></paramvàgt;
        /// <returnsvàgt;</returnsvàgt;

        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ác khai báo

    int

    firstNumber

    ,

    int

    secondNumber

    là các khai báo

    parametter

    . Với khai báo này ta biết được mong 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 coi 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

    & được hủy khi chấm dứt gọi

    hàm

    .

  • Số lượng

    parameter

    không hạn chế.

  • Khi sử dụng hàm phải truyền vào đủ & đúng

    parameter

    . (Đủ số lượng, đúng kiểu dữ liệu & đú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 nên các bản sao của

    parameter

    truyền vào trên Bộ nhớ đệm. Sau đó dùng những bản sao đó để giải quyết dữ liệu. Vì vậy chấm dứt lời gọi hàm giá trị của các

    parameter

    sẽ không bị biến đổi.

 Cùng xét thêm một chẳng hạn 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 nên 2 số mới. Không trọng yếu lắm
                firstNum += count;
                secondNum += count * 2 % 5;
            }

            Console.ReadKey();
        }
       

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

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

        /// <summaryvàgt;
        /// hàm trả ra kết quả tổng của 2 số firstNumber & secondNumber
        /// </summaryvàgt;
        /// <param name="firstNumber"></paramvàgt;
        /// <param name="secondNumber"></paramvàgt;
        /// <returnsvàgt;</returnsvàgt;

        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ố

  •  Chẳng hạn 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 & 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òn nếu không sử dụng

    parametter

    trong hàm thì không nên khai báo

    parametter

    để tránh phung phí bộ nhớ lưu trữ!

Tổng kết

Qua bài này tất cả chúng ta đã nắm được hàm là gì, cách dùng hàm.

Bài sau tất cả chúng ta sẽ khám phá về BIẾɳ TOÀɳ CỤ₵ VÀ BIẾɳ CỤ₵ BỘ TRONG ₵#.

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

Bàn luận

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

Xem Thêm  SQL KHÔNG TỒN TẠI: Tìm các bản ghi chưa được so khớp - sql nơi không tồn tại

Viết một bình luận