Từ khóa static trong C#
thường được lập trình viên sử dụng để quản lý bộ nhớ hiệu quả. Chúng ta có thể sử dụng từ khóa static cho các trường (biến lớp, biến class, trường thể hiện), phương thức và lớp. Hiểu được cách sử dụng và ý nghĩa của static trong C# sẽ giúp bạn giải quyết các bài toán nhanh chóng và chính xác. Hãy cùng tìm hiểu về từ khóa này qua bài viết này.
Giới thiệu về từ khóa static trong C
Từ khóa static có thể được áp dụng trên lớp, trường, phương thức, thuộc tính, toán tử, sự kiện và phương thức khởi tạo
Từ khóa static trong C# giống như các ngôn ngữ lập trình khác như C++, Java, và nhiều ngôn ngữ khác. Từ khóa static có thể được áp dụng trên lớp, trường, phương thức, thuộc tính, toán tử, sự kiện và phương thức khởi tạo. Tuy nhiên, nó không thể được sử dụng với các bộ chỉ mục (indexers), phương thức hủy hoặc các kiểu dữ liệu khác ngoài lớp.
Chỉ thị static trong C# khi được áp dụng cho một lớp sẽ làm cho lớp đó không thể khởi tạo thể hiện bằng từ khóa new
. Nếu chỉ thị static được áp dụng cho một trường, phương thức hoặc thuộc tính của lớp, chúng không thể được truy cập từ đối tượng thể hiện của lớp, mà chỉ có thể truy cập ở cấp độ lớp bằng cú pháp sau: TênLớp.TênTrường
hoặc TênLớp.TênPhươngThức
.
Ví dụ về static class trong C
Dưới đây là kết quả khi biên dịch và chạy chương trình:
0 This is a static method. 100
Trong ví dụ trên, MyStaticClass
là một lớp tĩnh với trường, phương thức và thuộc tính tĩnh. Tất cả các thành viên tĩnh chỉ có thể được truy cập từ cấp độ lớp, ví dụ MyStaticClass.MyStaticMethod()
.
Một lớp bình thường cũng có thể có các thành viên tĩnh. Bạn có thể khởi tạo các lớp bình thường bằng cách sử dụng từ khóa new
như bình thường. Tuy nhiên, biến đối tượng chỉ có thể truy cập các trường, thuộc tính và phương thức không tĩnh, không thể truy cập các phương thức và biến tĩnh. Tất cả các thành viên tĩnh chỉ có thể truy cập ở cấp độ lớp.
Ví dụ: hãy xem lớp MyNonStaticClass
sau đây với sự pha trộn của các phương thức tĩnh và không tĩnh:
Trong ví dụ trên, MyNonStaticClass
có thể được khởi tạo và truy cập các thành viên không tĩnh. Tuy nhiên, bạn không thể truy cập các thành viên tĩnh từ đối tượng được khởi tạo từ lớp.
Phương thức khởi tạo tĩnh trong C
Một phương thức khởi tạo tĩnh trong một lớp không tĩnh chỉ chạy một lần khi lớp được khởi tạo lần đầu tiên.
Một lớp tĩnh hoặc không tĩnh có thể có một phương thức khởi tạo tĩnh (static constructor in C#) mà không có bất kỳ chỉ thị truy cập nào như public
, private
, protected
, v.v.
Một phương thức khởi tạo tĩnh trong một lớp không tĩnh chỉ chạy một lần khi lớp được khởi tạo lần đầu tiên. Trong khi một phương thức khởi tạo tĩnh trong một lớp tĩnh chỉ chạy một lần khi bất kỳ thành viên tĩnh nào của nó được truy cập lần đầu tiên.
Dưới đây là kết quả khi biên dịch và chạy chương trình:
Inside static constructor.
Trong ví dụ trên, các thành viên tĩnh được truy cập nhiều lần. Tuy nhiên, phương thức khởi tạo tĩnh chỉ được gọi một lần khi bất kỳ thành viên tĩnh nào được truy cập lần đầu tiên.
Dưới đây là kết quả khi biên dịch và chạy chương trình:
Inside static constructor
Trong ví dụ trên, chúng ta khởi tạo MyNonStaticClass
ba lần, nhưng phương thức khởi tạo tĩnh chỉ được gọi một lần khi nó được khởi tạo lần đầu tiên.
Phân bổ bộ nhớ cho các thành phần tĩnh
Bộ nhớ của ứng dụng trong C# là stack và heap
Bộ nhớ của ứng dụng trong C# được phân thành hai phần là stack và heap. Các thành viên tĩnh được lưu trữ trong một khu vực đặc biệt bên trong heap gọi là heap tần số cao (high frequency heap).
Các thành viên tĩnh của lớp không tĩnh cũng được lưu trữ trong heap và được chia sẻ trên tất cả các thể hiện của lớp. Vì vậy, những thay đổi được thực hiện bởi một thể hiện sẽ được phản ánh trong tất cả các thể hiện khác của lớp.
Như đã đề cập ở trên, một thành viên tĩnh chỉ có thể chứa hoặc truy cập các thành viên tĩnh khác. Vì các thành viên tĩnh được gọi mà không tạo một thể hiện và vì vậy chúng không thể truy cập các thành viên không tĩnh.
Những điểm cần ghi nhớ khi sử dụng static void C
- Các lớp tĩnh không thể được khởi tạo bằng từ khóa
new
. - Các thành phần tĩnh chỉ có thể truy cập các thành phần tĩnh khác. Ví dụ, một lớp tĩnh chỉ có thể chứa các thành viên tĩnh. Một phương thức tĩnh chỉ có thể truy cập các thành phần tĩnh khác.
- Các thành phần tĩnh chia sẻ tài nguyên giữa nhiều người dùng.
- Chỉ thị static trong C# không được sử dụng với các bộ chỉ mục (indexers), phương thức hủy hoặc các kiểu dữ liệu khác ngoài lớp.
- Một phương thức khởi tạo tĩnh trong một lớp không tĩnh chỉ chạy một lần khi lớp được khởi tạo lần đầu tiên.
- Một phương thức khởi tạo tĩnh trong một lớp tĩnh chỉ chạy một lần khi bất kỳ thành viên tĩnh nào của nó được truy cập lần đầu tiên.
- Các thành viên tĩnh được phân bổ trong vùng heap tần số cao (high frequency heap) của bộ nhớ.