23 tháng 4, 2020

Hàm khởi tạo và hàm hủy

Hàm khởi tạo và hàm hủy trong C#

Trong thế giới thực, mỗi loài động vật, mỗi loại đồ vật đều mang sẵn trong mình một đặc điểm nào đó. Ví dụ loài chó có 4 chân, sủa "gâu gâu", có chiều cao, chiều dài, cân nặng; khẩu súng thì phải có nòng, cò súng.
Lập trình hướng đối tượng là phương pháp giúp ánh xạ thế giới thực vào thế giới ảo nên đã xuất hiện hàm khởi tạohàm huỷ bỏ để thể hiện các đặc tính trên.

1. Hàm khởi tạo

Hàm khởi tạo (constructor) là một phương thức đặc biệt được gọi tự động tại thời điểm đối tượng được tạo ra.
Mục đích của hàm khởi tạo dùng để khởi tạo dữ liệu cho đối tượng.

Đặc điểm:
- Có tên trùng với tên lớp
- Không có kiểu trả về, kể cả kiểu void
- Được tự động gọi khi 1 đối tượng thuộc lớp được khởi tạo
- Nếu như bạn không khai báo bất kỳ hàm khởi tạo nào thì hệ thống sẽ tự tạo hàm khởi tạo mặc định không đối số và không có nội dung gì
- Có thể có nhiều constructor bên trong 1 lớp

Có 2 loại hàm khởi tạo là:
- Hàm khởi tạo không có đối số 
- Hàm khởi tạo có đối số

Ví dụ: khởi tạo một lớp mèo đen có đặc điểm chung mặc định là màu đen
namespace ConsoleApp9
{
    public class BlackCat
    {
        public double Weight;
        public double Height;
        public string Color;

        public BlackCat()
        {
            Color = "Mau den";
        }
        public void ShowInfo()
        {
            Console.WriteLine("{0}, {1} kg, {2} cm ", Color, Weight, Height);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            BlackCat BlackCat1 = new BlackCat();
            BlackCat1.ShowInfo();

            BlackCat BlackCat2 = new BlackCat();
            BlackCat2.ShowInfo();

            Console.ReadLine();
        }
    }
}

Kết quả

Cả 2 đối tượng mèo đều có màu mặc định là màu đen nhưng không có chiều cao và cân nặng. Vì mình chưa khởi tạo giá trị cho các biến đó nên chúng mang giá trị mặc định là 0. Hàm khởi tạo này là hàm khởi tạo không có đối số.

Ví dụ 2: Hàm khởi tạo có đối số
namespace ConsoleApp9
{
    public class BlackCat
    {
        public double Weight;
        public double Height;
        public string Color = "Mau den";

        public BlackCat(double w, double h)
        {
            Weight = w;
            Height = h;
        }
        public void ShowInfo()
        {
            Console.WriteLine("{0}, {1} kg, {2} cm ", Color, Weight, Height);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            BlackCat BlackCat1 = new BlackCat(2.2, 20);
            BlackCat1.ShowInfo();

            BlackCat BlackCat2 = new BlackCat(2.6, 25);
            BlackCat2.ShowInfo();

            Console.ReadLine();
        }
    }
}

Kết quả

Lưu ý
- Bạn cần truyền đủ tham số và đúng thứ tự, đúng kiểu dữ liệu theo hàm khởi tạo.
- Một lớp có thể có nhiều constructor nhưng khi 1 đối tượng được khởi tạo thì chỉ có 1 constructor phù hợp nhất được gọi. 
Giả sử mình không gán giá trị Color khi khai báo mà cho vào trong hàm khởi tạo như sau
public BlackCat()
{
       Color = "Mau den";
}
public BlackCat(double w, double h)
{
       Weight = w;
       Height = h;
}

Kết quả chương trình sẽ không khởi tạo giá trị Color, không có chữ "Mau den" hiện ra màn hình. 

2. Hàm hủy

Hàm hủy (destructor) hoạt động ngược lại với hàm tạo, dùng để thu hồi đối tượng.

Đặc điểm

- Có tên trùng với tên lớp nhưng để dễ phân biệt với constructor thì bạn nên thêm dấu “~” vào trước tên hàm
- Không có kiểu trả về
- Được tự động gọi khi 1 đối tượng thuộc lớp kết thúc “vòng đời” của nó thông qua bộ thu dọn rác tự động GC (Garbage Collection)
- Nếu bạn không khai báo destructor thì C# sẽ tự động tạo ra 1 destructor mặc định và không có nội dung gì
- Hàm hủy không chấp nhận bất kỳ tham số nào và không được sửa đổi hàm hủy
- Hàm hủy không thể được định nghĩa trong cấu trúc. Hàm hủy chỉ được sử dụng với các lớp
- Hàm hủy không thể bị overload hoặc kế thừa
- Chỉ có 1 destructor duy nhất trong 1 lớp

Ví dụ: Mình tạo thêm một hàm hủy vào chương trình trong ví dụ 2
~ BlackCat()
{
       Console.WriteLine("Huy");
}

Bấm Ctrl + F5 (Ctrl + Fn + F5) để chạy và dừng màn hình. Kết quả sẽ có 2 dòng thông tin 2 đối tượng mèo hiện ra giống ví dụ 2. Lúc này chương trình chưa hủy, bạn gõ Enter thì 2 dòng chữ Hủy sẽ hiện ra màn hình. Vậy là chương trình đã hủy 2 đối tượng mèo.

Destructor được gọi là ngầm định bởi trình thu thập rác .NET framework vậy nên chúng ta không cần quá quan tâm đến hàm hủy này làm gì. ^^

SHARE THIS

Blogger Nguyễn Dương

Có một câu nói mà mình rất thích đó là "Thật sai lầm khi nghĩ rằng một khi rời khỏi trường học, bạn không cần học thêm điều mới nữa". Chính vì thế mà hãy luôn luôn học hỏi, con người chỉ ngừng phát triển khi ngừng học hỏi. Nếu như bạn chưa hiểu nội dung bài viết hoặc đang khúc mắc khi thao tác thì hãy bình luận phía dưới bài viết để mọi người cùng thảo luận nhé!