static vs non-static trong C#

Bài trước ta có nói về phương thức (method) trong lớp, nó không chứa static trong khai báo, vậy sự khác nhau giữa static và non-static là gì?

static: là những thứ chung, tức là hành động chung của một lớp chứ không phải một đối tượng riêng biệt, biến hoặc hàm có khai báo static sẽ tồn tại từ lúc chương trình bắt đầu và mất khi chương trình kết thúc. 

non-static: là những hành động riêng của từng đối tượng,  những phương thức, thuộc tính không có static chỉ tồn tại khi đối tượng được tạo ra, và mất khi đối tượng bị hủy khỏi bộ nhớ.

Đoạn mã dưới sẽ cho ta thấy sự khác nhau giữa static và non-static.

public class Xe
{
    //thuộc tính biển số xe
    public string BienSo { get; set; }

    //thuộc tính static đèn xe.
    public static string Den { get; set; }

    //hàm ChayStatic
    public static void ChayStatic()
    {
        Console.WriteLine("Xe dang chay");
    }

    //phương thức ChayNonStatic
    public void ChayNonStatic()
    {
        Console.WriteLine("Ham ChayNonStatic");
    }
}
static void Main(string[] args)
{
    //static
    Xe.Den = "Den Vang";
    Xe.ChayStatic();
  
    //none static
    Xe xe = new Xe();
    xe.BienSo = "80B - 8888";
    xe.ChayNonStatic();
    Console.ReadLine();
}

Phân tích mã:

Bước 1: Tạo lớp xe với một thuộc tính là BienSo và một thuộc tính static là Den, một phương thức là ChayNonStatic, ChayStatic. Thuộc tính biển số sẽ giúp các đối tượng phân biệt với nhau.

Bước 2: trong hàm Main, ta gọi hàm ChayStatic thông qua Xe.ChayStatic(), ta cũng có thể truy cập trực tiếp vào thuộc tính Den thông qua Xe.Den;

Bước 3: tạo một đối tượng xe, từ lớp xe và gán cho nó biển số (Câu lệnh gán sẽ gọi hàm set; trong thuộc tính ra)

Bước 4: từ đối tượng xe được tạo, gọi ra phương thức ChayNonStatic().

Nhận xét: thuộc tính và hàm static có thể sử dụng trực tiếp mà không thông qua đối tượng.

Đối với những hàm không có static thì chỉ có thể truy cập thông qua đối tượng.

Tại sao không dùng static cho khỏe, bày ra đối tượng (object) để làm gì?

Trả lời: static sẽ được dùng trong các hàm chung, thường trả về một kết quả giống nhau mà không cần quan tâm quá đến sự biến đổi của dữ liệu.

Ví dụ: Console.WriteLine("Chuoi"); lúc nào nó cũng in ra màn hình chuỗi được nhập vào.

Tuy nhiên nếu quá lạm dụng static, sẽ đi theo lối mòn của các lập trình hướng thủ tục (procedural programming approach) như đã đề cập ở bài đầu tiên.

Ở bài sau, ta sẽ phân tích về sự hạn chế của static.

Các môn học khác

Khoa học về dinh dưỡng, giáo trình giảm cân cho mọi người.

SQL là ngôn ngữ truy vấn mang tính cấu trúc, nó cho phép bạn truy cập và sử dụng database.

Chương trình thường được xây dựng quanh dữ liệu và logic để xử lý chúng. Nói cách khác: Program = Cấu trúc dữ liệu + giải thuật. Do vậy đây là môn học bắt buộc dành cho các lập trình viên.