1. Các modifier truy cập cơ bản trong C#
Khi bạn code, thường muốn kiểm soát rõ ràng ai và từ đâu có thể nhìn thấy hoặc thay đổi biến của bạn và gọi method. Nó giống như trong một chung cư: không phải phòng nào cũng mở cho tất cả mọi người. Có phòng chỉ cư dân mới vào được, có phòng chỉ kỹ thuật viên mới vào được.
Trong lập trình, cái "kiểm soát truy cập" này được giải quyết bằng modifier truy cập. Chúng xác định thành viên của class (biến, field, method, property, v.v.) có nhìn thấy được ngoài class, ở class khác, hay ở project khác không. Đây là một trong những cách chính để thực hiện đóng gói (encapsulation) trong OOP: mình giấu chi tiết cài đặt, chỉ đưa ra "interface" cần thiết cho bên ngoài.
Đây là bảng các modifier chính và mô tả ngắn gọn:
| Modifier | Nhìn thấy ở đâu? (giải thích dễ hiểu) |
|---|---|
|
Mọi nơi (trong project và ngoài project — nếu có assembly) |
|
Chỉ bên trong cùng class đó |
|
Giống như private |
Nhìn có vẻ ghê nhỉ? Thực ra không có gì khó đâu. Cùng xem ví dụ để hiểu nên dùng cái nào ở đâu nhé.
2. Modifier public — ai cũng vào được
Modifier public làm cho biến hoặc method của bạn nhìn thấy mọi nơi. Nếu bạn khai báo thành viên class là public, thì code nào nhìn thấy class của bạn cũng có thể truy cập nó.
public class Person
{
public string Name;
public void SayHello()
{
Console.WriteLine($"Xin chào! Tớ tên là {Name}");
}
}
Giờ ở đâu cũng được (trong cùng project hoặc project khác nếu add reference tới assembly), bạn có thể viết:
Person p = new Person();
p.Name = "Alysa";
p.SayHello();
Lời khuyên thực tế: đừng làm mọi thứ đều public: đó là chìa khóa cho bảo mật code đấy.
3. Modifier private — tài sản riêng tư!
Modifier private đóng quyền truy cập vào nội dung class: bên ngoài không ai nhìn thấy hoặc thay đổi dữ liệu bên trong. Mặc định tất cả field và method trong class C# là private nếu bạn không ghi modifier khác.
public class Cup
{
private double volume; // Field này chỉ class Cup nhìn thấy
public void Fill(double value)
{
volume = value; // Dùng được bên trong class
}
public double GetVolume()
{
return volume; // Nhưng bên ngoài không biết volume tồn tại
}
}
Ở đây volume bị ẩn với tất cả bên ngoài, nhưng mọi method bên trong Cup đều dùng được. Để lấy dung tích, mình cung cấp method public GetVolume().
4. Phạm vi nhìn thấy: biến, method và class
Phạm vi nhìn thấy — là vùng trong chương trình mà tên của bạn (biến, method, class) có ý nghĩa và truy cập được.
- Biến local (khai báo trong method hoặc block code): chỉ nhìn thấy trong method hoặc block đó.
- Tham số method: chỉ nhìn thấy trong method đó.
- Field class: nhìn thấy ở mọi nơi trong class (tùy modifier truy cập).
- Class: class lồng nhau chỉ nhìn thấy trong class bọc ngoài nếu nó là private, v.v.
Xem ví dụ về phạm vi nhìn thấy:
public class Counter
{
private int count = 0; // nhìn thấy ở mọi nơi trong class
public void Increment()
{
count++; // dùng được field
int temp = count * 2; // temp chỉ nhìn thấy trong Increment
}
public int GetCount()
{
// temp ở đây không nhìn thấy!
return count;
}
}
Nếu bạn thử truy cập temp trong GetCount() — sẽ bị lỗi ngay.
5. Shadowing biến (shadowing)
Shadowing — là khi trong một phạm vi, bạn khai báo biến (hoặc tham số) trùng tên với biến ở phạm vi ngoài. Trong block đó, tên "mới" sẽ che khuất tên cũ, và bạn không thể truy cập giá trị ngoài trực tiếp nữa.
Ví dụ shadowing:
class ShadowDemo
{
int value = 10; // field class
void PrintValue()
{
Console.WriteLine(value); // 10 — field class
int value = 5; // biến local che field class
Console.WriteLine(value); // in ra 5, không phải 10
}
}
Trong ví dụ này, khi bạn viết int value = 5;, nó che khuất field class cùng tên trong method. Khi truy cập value trong PrintValue(), biến local sẽ được dùng, không phải field class.
Nếu vẫn muốn truy cập field class, dùng từ khóa this:
class ShadowDemo
{
int value = 10;
void PrintValue()
{
Console.WriteLine(value); // 10 — field class
int value = 5;
Console.WriteLine(value); // 5 — biến local
Console.WriteLine(this.value); // 10 — field class
}
}
Shadowing dễ gây rối, nên tốt nhất đặt tên biến rõ ràng, khác nhau — nhất là khi làm việc nhóm lớn.
GO TO FULL VERSION