CodeGym /Các khóa học /C# SELF /Modifier truy cập và phạm vi nhìn thấy

Modifier truy cập và phạm vi nhìn thấy

C# SELF
Mức độ , Bài học
Có sẵn

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 aitừ đâ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)
public
Mọi nơi (trong project và ngoài project — nếu có assembly)
private
Chỉ bên trong cùng class đó
(không có modifier)
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}");
    }
}
Ví dụ class với field và method public

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
    }
}
Ví dụ dùng field private

Ở đâ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;
    }
}
Ví dụ phạm vi nhìn thấy của biến

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
    }
}
Ví dụ shadowing biến (shadowing)

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
    }
}
Dùng this để truy cập field class khi bị shadowing

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.

1
Khảo sát/đố vui
, cấp độ , bài học
Không có sẵn
Hàm
Giới thiệu về hàm
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION