27 Hàm hủy – Operator Overloading – Static – Indexer

1. Phương thức Hủy (Destructor)

Khái niệm

  • Destructor là một phương thức đặc biệt được gọi tự động khi đối tượng bị hủy.
  • Trong C#, garbage collector (GC) sẽ tự động quản lý bộ nhớ cho các đối tượng không còn được tham chiếu. Destructor thường được sử dụng để giải phóng tài nguyên không được quản lý, chẳng hạn như bộ nhớ không phải .NET hoặc kết nối đến cơ sở dữ liệu.

Đặc điểm

  • Destructor không có tham số và không có kiểu trả về.
  • Được định nghĩa bằng cách sử dụng dấu ngã (~) trước tên lớp.
  • Không thể gọi trực tiếp destructor; nó được gọi bởi GC.

Ví dụ:

class MyClass
{
    ~MyClass()
    {
        Console.WriteLine("Destructor called!");
        // Code để giải phóng tài nguyên không quản lý
    }
}

class Program
{
    static void Main()
    {
        MyClass obj = new MyClass();
    }
}
// Output: Destructor sẽ được gọi tự động khi chương trình kết thúc hoặc khi GC thu gom obj.

2. Quá tải Toán tử (Operator Overloading)

Khái niệm

  • Cho phép bạn định nghĩa cách các toán tử (như +, -, *, /) hoạt động với các đối tượng của lớp.
  • Cần sử dụng từ khóa operator để định nghĩa toán tử.

Các Toán tử Hỗ trợ Quá tải

  • Toán tử số học: +, -, *, /
  • Toán tử quan hệ: ==, !=, <, >
  • Toán tử logic: &, |
  • Không hỗ trợ quá tải các toán tử như =..

Ví dụ:

class Complex
{
    public double Real { get; set; }
    public double Imaginary { get; set; }

    public Complex(double real, double imaginary)
    {
        Real = real;
        Imaginary = imaginary;
    }

    // Quá tải toán tử +
    public static Complex operator +(Complex c1, Complex c2)
    {
        return new Complex(c1.Real + c2.Real, c1.Imaginary + c2.Imaginary);
    }

    public override string ToString()
    {
        return $"{Real} + {Imaginary}i";
    }
}

class Program
{
    static void Main()
    {
        Complex c1 = new Complex(1.5, 2.5);
        Complex c2 = new Complex(3.5, 4.5);
        Complex result = c1 + c2;

        Console.WriteLine(result); // Output: 5 + 7i
    }
}

3. Thành viên Tĩnh (Static Members)

Khái niệm

  • Thành viên tĩnh là các thuộc tính hoặc phương thức được chia sẻ giữa tất cả các đối tượng của lớp.
  • Không cần tạo đối tượng để truy cập thành viên tĩnh.
  • Sử dụng từ khóa static.

Lợi ích

  • Dùng cho các phương thức tiện ích hoặc hằng số mà không cần phụ thuộc vào trạng thái đối tượng.

Ví dụ:

class Calculator
{
    public static double Pi = 3.14159;

    public static double Add(double a, double b)
    {
        return a + b;
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine($"Pi: {Calculator.Pi}");
        Console.WriteLine($"Sum: {Calculator.Add(5, 10)}");
    }
}
// Output:
// Pi: 3.14159
// Sum: 15

4. Lớp Tĩnh (Static Class)

Khái niệm

  • Lớp tĩnh là lớp chỉ chứa các thành viên tĩnh.
  • Không thể khởi tạo đối tượng từ lớp tĩnh.
  • Sử dụng khi không cần lưu trạng thái riêng cho từng đối tượng.

Ví dụ:

static class MathUtilities
{
    public static int Square(int number)
    {
        return number * number;
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine(MathUtilities.Square(5)); // Output: 25
    }
}

5. Biến Chỉ đọc (Readonly)

Khái niệm

  • readonly chỉ cho phép gán giá trị một lần, tại thời điểm khai báo hoặc trong constructor.
  • Dữ liệu readonly đảm bảo bất biến sau khi khởi tạo.

Sự khác biệt giữa readonlyconst:

  • const: Phải được gán giá trị tại thời điểm biên dịch.
  • readonly: Giá trị có thể được gán tại runtime trong constructor.

Ví dụ:

class Example
{
    public readonly int MyValue;

    public Example(int value)
    {
        MyValue = value;
    }
}

class Program
{
    static void Main()
    {
        Example obj = new Example(10);
        Console.WriteLine(obj.MyValue); // Output: 10
    }
}

6. Bộ chỉ mục (Indexer)

Khái niệm

  • Bộ chỉ mục (indexer) cho phép đối tượng hoạt động giống như một mảng, sử dụng cú pháp [].
  • Được sử dụng trong các lớp đại diện cho tập hợp dữ liệu.

Ví dụ:

class SampleCollection<T>
{
    private T[] data = new T[100];

    public T this[int index]
    {
        get { return data[index]; }
        set { data[index] = value; }
    }
}

class Program
{
    static void Main()
    {
        SampleCollection<int> collection = new SampleCollection<int>();
        collection[0] = 42;
        Console.WriteLine(collection[0]); // Output: 42
    }
}

7. Tóm tắt

Chủ đềĐặc điểm
DestructorPhương thức hủy, tự động gọi bởi GC để giải phóng tài nguyên không quản lý.
Quá tải toán tửCho phép định nghĩa lại cách các toán tử hoạt động với lớp tự định nghĩa.
Thành viên tĩnhThành viên chia sẻ giữa các đối tượng, không cần khởi tạo lớp để truy cập.
Lớp tĩnhLớp không thể khởi tạo, chỉ chứa thành viên tĩnh.
Biến chỉ đọcGán giá trị một lần, tại khai báo hoặc trong constructor.
Bộ chỉ mụcCung cấp cách truy cập đối tượng giống như mảng.

Những chủ đề này giúp bạn nâng cao khả năng tổ chức mã nguồn, tối ưu hiệu suất, và xây dựng các hệ thống phức tạp trong lập trình C#.

Để lại một bình luận 0

Your email address will not be published. Required fields are marked *