Static trong C# là gì? Tìm hiểu về từ khóa static trong C#

Từ khóa static trong c# thường được lập trình viên sử dụng với mục đích là quản trị bộ nhớ hiệu quả. Ta có thể dùng từ khóa static cho các trường (cũng được gọi là biến lớp, biến class, trường thể hiện), phương thức, lớp. Hiểu được cách dùng, ý nghĩa của static in C# sẽ giúp bạn giải quyết các bài toán nhanh chóng, chính xác nhất. Cùng Comdy tìm hiểu rõ hơn trong bài viết này nhé.

Giới thiệu về từ khóa static trong C#

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

Static trong c# là gì? C# có từ khóa static giống như các ngôn ngữ lập trình khác như C ++, Java, v.v … 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# làm cho một thành phần không thể khởi tạo được, điều đó có nghĩa là thành phần tĩnh không thể được khởi tạo. Nếu chỉ thị static trong c# được áp dụng cho một lớp thì lớp đó không thể khởi tạo thể hiện bằng từ khóa new.

Nếu chỉ thị static trong OOP được áp dụng cho một trường, phương thức hoặc thuộc tính của lớp thì 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 ClassName.PropertyName, ClassName.MethodName.

Ví dụ về static class trong c#

public static class MyStaticClass
{
    public static int myStaticVariable = 0;

    public static void MyStaticMethod()
    {
        Console.WriteLine("This is a static method.");
    }

    public static int MyStaticProperty { get; set; }
}

class Program
{
    static void Main(string[] args)
    {        
        Console.WriteLine(MyStaticClass.myStaticVariable);
        MyStaticClass.MyStaticMethod();
        MyStaticClass.MyStaticProperty = 100;
        Console.WriteLine(MyStaticClass.MyStaticProperty);
    }
}
Lớp tĩnh (c# static class) 

Đâ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 (lớp không tĩnh) 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 không tĩnh 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, nó 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 xét 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:

public class MyNonStaticClass
{
    private static int myStaticVariable = 0;

    public static void MyStaticMethod()
    {
        Console.WriteLine("This is static method.");
    }

    public void MyNonStaticMethod()
    {
        Console.WriteLine("Non-static method");
    }
}
Thành viên tĩnh (static member) trong lớp không tĩnh trong C#

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#

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.

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.

public static class MyStaticClass
{
    public static int myStaticVariable = 0;
    public static int MyStaticProperty { get; set; }
    
    static MyStaticClass()
    {
        Console.WriteLine("Inside static constructor.");
    }

    public static void MyStaticMethod()
    {
        Console.WriteLine("This is static method.");
    }
}

class Program
{
    static void Main(string[] args)
    {        
        MyStaticClass.myStaticVariable = 100;
        MyStaticClass.MyStaticProperty = 200;
        MyStaticClass.myStaticVariable = 300;
        MyStaticClass.MyStaticProperty = 400;
    }
}
Phương thức khởi tạo tĩnh (static constructor) trong lớp tĩnh trong C#

Đâ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.

public class MyNonStaticClass
{
    static MyNonStaticClass()
    {
        Console.WriteLine("Inside static constructor.");
    }
            
    public void MyNonStaticMethod()
    {
        Console.WriteLine("Non-static method");
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyNonStaticClass mnsObj1 = new MyNonStaticClass();
        MyNonStaticClass mnsObj2 = new MyNonStaticClass();
        MyNonStaticClass mnsObj3 = new MyNonStaticClass();
    }
}
Phương thức khởi tạo tĩnh static c# trong một lớp không tĩnh

Đâ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 tôi khởi tạo MyNonStaticClass ba lần nhưng hàm tạo tĩnh chỉ được gọi một lần khi nó khởi tạo lần đầu tiên.

Phân bổ bộ nhớ cho các thành phần tĩnh

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

Như bạn đã biết, bộ nhớ của ứng dụng trong C# 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. Bởi 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 mục 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ớ.

Static trong java là gì?

Static trong java là gì
Từ khóa static trong java được sử dụng để khai báo một thành phần của lớp dùng chung cho tất cả các đối tượng của lớp đó

Static là gì trong java? Về ý nghĩa, static trong java cũng tương tự như static in c#. Từ khóa static trong java được sử dụng để khai báo một thành phần của lớp (thuộc tính hoặc phương thức) dùng chung cho tất cả các đối tượng của lớp thay vì mỗi đối tượng có một bản sao riêng biệt của thành phần đó.

Khi một thành phần được khai báo là “static”, nó thuộc về lớp chứ không thuộc về các đối tượng của lớp đó. Điều này có nghĩa là tất cả các đối tượng của lớp đó chia sẻ cùng một bản sao của thành phần “static” đó.

Phương thức khởi tạo trong c# là gì?

Trong C#, phương thức khởi tạo (constructor) được sử dụng để khởi tạo các đối tượng của một lớp.Phương thức khởi tạo có cùng tên với lớp và không có kiểu trả về. Nhiệm vụ của phương thức khởi tạo là thiết lập giá trị ban đầu cho các thuộc tính và trạng thái của đối tượng khi nó được tạo.

Cú pháp:

class ClassName
{
public ClassName()
{
// Thiết lập giá trị ban đầu cho các thuộc tính và trạng thái của đối tượng
}
}

Trong một lớp, có thể định nghĩa nhiều phương thức khởi tạo khác nhau, nhưng phải có các danh sách tham số khác nhau.

Sự khác nhau giữa stack và heap trong C#

Sự khác nhau giữa stack và heap trong C#
Việc hiểu và sử dụng đúng cách stack và heap giúp bạn viết mã hiệu quả và tránh các vấn đề về quản lý bộ nhớ.
Trong C#, các đối tượng và dữ liệu được lưu trữ trong bộ nhớ trong hai vùng chính: stack và heap. Dưới đây là sự khác nhau giữa stack và heap trong C#:

Stack trong C#

  • Dùng để lưu trữ các biến cục bộ và thông tin về các phương thức.
  • Cấp phát và giải phóng bộ nhớ tự động.
  • Kích thước của stack được xác định tại thời điểm biên dịch và thường nhỏ hơn kích thước của heap.
  • Thời gian truy cập và thực thi nhanh hơn heap.
  • Thời gian tồn tại của các biến trên stack ngắn hơn. Khi phương thức kết thúc, các biến stack bị xóa.
  • Có giới hạn về kích thước.

Heap trong C#

  • Dùng để lưu trữ các đối tượng và dữ liệu có thời gian tồn tại lâu hơn hoặc không xác định.
  • Cấp phát và giải phóng bộ nhớ thủ công (phải thực hiện bằng cách sử dụng các phương thức như new và delete).
  • Kích thước của heap lớn hơn stack.
  • Thời gian truy cập và thực thi chậm hơn stack.
  • Đối tượng trên heap tồn tại cho đến khi không còn tham chiếu nào đến nó hoặc bị thu gom rác.
  • Không có giới hạn về kích thước (nếu không gây ra lỗi OutOfMemoryException).
Stack và heap đều đóng vai trò rất quan trọng trong việc quản lý bộ nhớ và vòng đời của đối tượng trong C#. Việc hiểu và sử dụng đúng cách stack và heap giúp bạn viết mã hiệu quả và tránh các vấn đề về quản lý bộ nhớ.

Kết lại

Trên đây là toàn bộ chia sẻ của Comdy.vn về static trong C#. Hi vọng những chia sẻ trong bài viết này là bổ ích và có ý nghĩa với mọi người. Xim cám ơn!

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *