VieTopik
Tiếng HànTiếng AnhIT
  • Góc học tập
Tải app
  • Thư viện
  • Luyện thi
  • Cẩm nang
  • Góc học tập
C# CoreClass cơ bản
Bài 14/19
5 phút

static

Nội dung bài · 5 mục
  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt

Mỗi sản phẩm có tên và giá riêng. Nhưng thuế suất 10% thì chung cho mọi sản phẩm, không thuộc về riêng cái nào. Những thứ dùng chung như vậy được khai báo bằng static.

Khái niệm

📌 static: từ khoá đánh dấu thành viên thuộc về chính class chứ không thuộc về object nào, gọi qua tên class.

Bạn đã dùng static từ bài đầu tiên mà không để ý. Console.WriteLine là một static method: gọi thẳng qua tên class Console, không cần new Console().

Ví dụ

decimal price = Tax.Apply(100000m);
Console.WriteLine(price);      // 110000
Console.WriteLine(Tax.Rate);   // 10

class Tax
{
    public static int Rate = 10;   // phần trăm

    public static decimal Apply(decimal price)
    {
        return price + price * Rate / 100;
    }
}
  • Tax.Rate và Tax.Apply(...) gọi qua tên class, không tạo object.
  • Static field chỉ có một bản, dùng chung cho cả chương trình.
  • Static method không dùng trực tiếp được field hay property thường của class, vì nó không thuộc object nào.

So sánh nhanh:

Thành viên thường Thành viên static
Thuộc về từng object class
Gọi qua object: pen.Price tên class: Tax.Rate
Số bản mỗi object một bản một bản duy nhất

Thử ngay

Dán vào Program.cs rồi chạy dotnet run:

var a = new Product("Bút bi");
var b = new Product("Vở");
var c = new Product("Thước");

Console.WriteLine(Product.Count);

class Product
{
    public static int Count;
    public string Name { get; }

    public Product(string name)
    {
        Name = name;
        Count++;
    }
}

Đoán trước khi chạy: mỗi lần tạo object, Count tăng thêm 1. Product.Count in ra 1 hay 3?

Xem kết quả
3

Là 3. Count là static nên cả ba object dùng chung một biến đếm. Nếu bỏ static, mỗi object sẽ có Count riêng, cái nào cũng bằng 1.

Lỗi hay gặp

Static method dùng thành viên thường. Compiler không biết lấy Price của object nào.

// SAI — lỗi compile: Price thuộc về từng object
class Item
{
    public decimal Price { get; set; }

    public static decimal WithTax()
    {
        return Price * 1.1m;
    }
}
// ĐÚNG — truyền giá trị vào qua tham số
class Item
{
    public decimal Price { get; set; }

    public static decimal WithTax(decimal price)
    {
        return price * 1.1m;
    }
}

Gọi thành viên static qua object. Static thuộc về class, nên phải gọi qua tên class.

// SAI — lỗi compile: Count phải gọi qua Product
var pen = new Product("Bút bi");
Console.WriteLine(pen.Count);
// ĐÚNG
var pen = new Product("Bút bi");
Console.WriteLine(Product.Count);

Tóm tắt

  • static gắn thành viên với class, không với object.
  • Gọi qua tên class: Tax.Rate, Console.WriteLine.
  • Static field chỉ có một bản dùng chung.
  • Static method không dùng trực tiếp được field và property thường.

Tự kiểm tra

0/3 câu
Câu 1

Math.Max(3, 7) được gọi mà không cần new Math(). Điều đó cho biết gì về Max?

Câu 2

Class Order có public static int NextId = 1; Tạo 5 object Order, mỗi constructor tăng NextId thêm 1. NextId cuối cùng là bao nhiêu?

Câu 3

Thứ nào nên khai báo static?

null và nullableenum

Nội dung bài

  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt