This article is currently in the process of being translated into Vietnamese (~88% done).
Static members
Như chúng ta thấy ở chương trước, cách thông thường để giao tiếp vowisi một class là tạo ra một thể hiện mới của class và sau đó làm việc với đối tượng. Trong hầu hết trường hợp, đây là cách tạo ra nhiều bản sao của cùng một class nhưng dùng chúng khác nhau. Tuy nhiên, trong vài trường hợp, bạn có thể có một class mà không cần dùng thể hiện hay ít nhất một class mà bạn có thể dùng thành viên mà không cần tạo đối tượng cho nó. Ví dụ, bạn có một class với biến không đổi. Đây gọi là thành viên tĩnh.
Một class có thể là tĩnh, nó có các thành viên tính, cả hàm và trường. Một class tĩnh không thể có thể hiện vì vậy nói cách khác, nó sẽ giống một nhóm các thành viên liên quan hơn là lớp thực sự. Bạn có thể chọn cách tạo class không tĩnh nhưng nó chứa một vài thành phần tĩnh. Một class không tĩnh chỉ có thể có thể hiện và dùng như class thông thường, nhưng bạn không thể dùng thành viên tĩnh của nó trong các đối tượng của class. Một class tĩnh chỉ có thể chứa các thành viên tĩnh.
Đầu tiên, đây là một ví dụ của class tĩnh:
public static class Rectangle
{
public static int CalculateArea(int width, int height)
{
return width * height;
}
}
Như bạn thấy, chúng ta dùng từ khóa static để chỉ định class là static, và sau đó chúng ta dùng nó để chỉ đinh phương thức CalculateArea là tĩnh. Nếu chúng ta không làm vậy, trình biên dịch sẽ báo lỗi vì chúng ta không thể chứa thành phần không tĩnh trong class tĩnh.
Để dùng phương thức này, chúng ta gọi trực tiếp từ class như sau:
Console.WriteLine("The area is: " + Rectangle.CalculateArea(5, 4));
Chúng ta có thể thêm các phương thức khác vào lớp Rectangle, nhưng có lẽ bạn sẽ tự hỏi tại sao chúng ta truyền chiều dài và chiều rộng vào hàm hiện tại, thay vì lưu nó vào trong lớp và sau đó lấy ra khi vần? Vì nó là tĩnh! Chúng ta có thể lưu chúng nhưng chỉ một tập hợp chiều vì chỉ có một phiên bản của lớp tĩnh. Điều này rất quan trọng để hiểu.
Instead, we can make the class non-static, and then have the CalculateArea as a utility function on this class:
public class Rectangle
{
private int width, height;
public Rectangle(int width, int height)
{
this.width = width;
this.height = height;
}
public void OutputArea()
{
Console.WriteLine("Area output: " + Rectangle.CalculateArea(this.width, this.height));
}
public static int CalculateArea(int width, int height)
{
return width * height;
}
}
Bạn có thể thấy, chúng ta tạo ra class không tĩnh. Chúng ta cũng thêm vào một hàm khởi tạo có hai tham số về chiều dài và chiều rộng để gán nó cho thể hiện. Sau đó chúng ta thêm vào phương thức OutputArea để dùng phương thức tính tính toán diên tích. Đây là một ví dụ hay về việc áp dụng cả thành viên tĩnh và không tĩnh trong cùng một lớp không tĩnh.
A common usage of static classes, although frowned upon by some people, are utility/helper classes, where you collect a bunch of useful methods, which might not belong together, but don't really seem to fit elsewhere either.