🎯 MỤC TIÊU
✅ Hiểu this là gì, dùng khi nào
✅ Phân biệt biến instance vs static
✅ Biết method static
✅ Áp dụng static để đếm object, quản lý dữ liệu chung
1️⃣ TỪ KHÓA this LÀ GÌ?
Định nghĩa dễ hiểu 🧠
this= chính object hiện tại
Ví dụ đời thật 👤
- “Tôi” trong đời thật
- Mỗi người có “tôi” khác nhau
👉 Trong code:
thiscủasv1≠thiscủasv2
2️⃣ KHI NÀO CẦN this?
Ví dụ gây nhầm lẫn 😵
class SinhVien
{
private string ten;
public void SetTen(string ten)
{
ten = ten; // ❌ sai, vô nghĩa
}
}
Sửa đúng bằng this ✅
public void SetTen(string ten)
{
this.ten = ten;
}
📌 this.ten = biến của class
📌 ten = tham số truyền vào
3️⃣ this TRONG CONSTRUCTOR
class NhanVien
{
private string ten;
private double luong;
public NhanVien(string ten, double luong)
{
this.ten = ten;
this.luong = luong;
}
public void HienThi()
{
Console.WriteLine($"{ten} | {luong}");
}
}
Test
NhanVien nv = new NhanVien("Hoài", 15000000);
nv.HienThi();
4️⃣ this GỌI CONSTRUCTOR KHÁC 🔁
Overload nâng cao
class Xe
{
private string hang;
private string mau;
private int tocDo;
public Xe() : this("Chưa rõ", "Trắng", 0)
{
}
public Xe(string hang) : this(hang, "Trắng", 0)
{
}
public Xe(string hang, string mau, int tocDo)
{
this.hang = hang;
this.mau = mau;
this.tocDo = tocDo;
}
public void HienThi()
{
Console.WriteLine($"{hang} | {mau} | {tocDo}");
}
}
📌 Code gọn hơn — tránh lặp logic.
5️⃣ STATIC LÀ GÌ?
Định nghĩa
static= thuộc về class, không thuộc object
So sánh nhanh ⚖️
| Instance | Static |
|---|---|
| Mỗi object có | Dùng chung |
Cần new | Không cần |
| Dữ liệu riêng | Dữ liệu toàn hệ |
6️⃣ BIẾN STATIC — DÙNG KHI NÀO?
Ví dụ đếm số sinh viên 🎓
class SinhVien
{
public static int dem = 0;
public string ten;
public SinhVien(string ten)
{
this.ten = ten;
dem++;
}
}
Test
SinhVien a = new SinhVien("A");
SinhVien b = new SinhVien("B");
SinhVien c = new SinhVien("C");
Console.WriteLine(SinhVien.dem);
👉 Output:
3
📌 Không cần tạo object để dùng dem.
7️⃣ METHOD STATIC 🔧
class ToanHoc
{
public static int Cong(int a, int b)
{
return a + b;
}
}
Gọi
int kq = ToanHoc.Cong(3, 5);
Console.WriteLine(kq);
📌 Không cần new ToanHoc().
8️⃣ STATIC + ENCAPSULATION 🔐
class HeThong
{
private static int soNguoiDung = 0;
public static void TangNguoiDung()
{
soNguoiDung++;
}
public static int LaySoNguoiDung()
{
return soNguoiDung;
}
}
Test
HeThong.TangNguoiDung();
HeThong.TangNguoiDung();
Console.WriteLine(HeThong.LaySoNguoiDung());
9️⃣ BÀI CONSOLE — LÀM TỪNG BƯỚC 🧩
🎯 Đề bài: QUẢN LÝ TÀI KHOẢN
Yêu cầu:
- Mỗi tài khoản có số dư riêng
- Tổng số tài khoản là dùng chung
✍️ Bước 1 — Khai báo class
class TaiKhoan
{
private double soDu;
public static int tongTaiKhoan = 0;
}
✍️ Bước 2 — Constructor
public TaiKhoan(double soDu)
{
if (soDu >= 0)
this.soDu = soDu;
tongTaiKhoan++;
}
✍️ Bước 3 — Method
public void Nap(double tien)
{
if (tien > 0)
soDu += tien;
}
public void HienThi()
{
Console.WriteLine("Số dư: " + soDu);
}
Test
TaiKhoan a = new TaiKhoan(1000);
TaiKhoan b = new TaiKhoan(2000);
Console.WriteLine("Tổng TK: " + TaiKhoan.tongTaiKhoan);
a.HienThi();
b.HienThi();
🔟 BÀI NÂNG CAO 🔥 QUẢN LÝ ID TỰ TĂNG
Yêu cầu
- ID tự tăng cho mỗi object
- Không trùng ID
Code
class SanPham
{
private static int autoId = 1;
private int id;
private string ten;
public SanPham(string ten)
{
this.id = autoId;
autoId++;
this.ten = ten;
}
public void HienThi()
{
Console.WriteLine($"{id} | {ten}");
}
}
Test
SanPham sp1 = new SanPham("Chuột");
SanPham sp2 = new SanPham("Bàn phím");
sp1.HienThi();
sp2.HienThi();
1️⃣1️⃣ PORT WINFORMS 🖥️
public class SanPham
{
private static int autoID = 0;
public int MaSP { get; private set; }
public string TenSP { get; set; }
public int GiaSP { get; set; }
public SanPham(string TenSP, int GiaSP)
{
MaSP = ++autoID;
this.TenSP = TenSP;
this.GiaSP = GiaSP;
}
}
UI bạn chèn
- DataGridView
- dgvDuLieu: hiển thị danh sách sản phẩm
private void frmMain_Load(object sender, EventArgs e)
{
// 1. Tạo danh sách sản phẩm (ID auto tăng static)
List<SanPham> danhSachSP = new List<SanPham>()
{
new SanPham("Book C", 10000),
new SanPham("Book C++", 15000),
new SanPham("Book C#", 20000),
};
// 2. Bind dữ liệu lên Grid
dgvDuLieu.DataSource = danhSachSP;
// 3. Đổi tên header
dgvDuLieu.Columns["MaSP"].HeaderText = "Mã SP";
dgvDuLieu.Columns["TenSP"].HeaderText = "Tên SP";
dgvDuLieu.Columns["GiaSP"].HeaderText = "Giá SP";
// 4. Cột giãn full chiều ngang
dgvDuLieu.AutoSizeColumnsMode =
DataGridViewAutoSizeColumnsMode.Fill;
// 5. Ẩn cột mũi tên trái
dgvDuLieu.RowHeadersVisible = false;
// 6. Không cho sửa / thêm
dgvDuLieu.ReadOnly = true;
dgvDuLieu.AllowUserToAddRows = false;
// 7. Select nguyên dòng
dgvDuLieu.SelectionMode =
DataGridViewSelectionMode.FullRowSelect;
// 8. Nền trắng phần trống
dgvDuLieu.BackgroundColor = Color.White;
}

📌 TỔNG KẾT
Học được gì?
✅ this phân biệt biến
✅ this gọi constructor
✅ static dùng chung
✅ method static
✅ auto ID
✅ đếm object