openplanning

Access Modifier trong C#

  1. Modifier trong CSharp
  2. Tổng quan về access modifier
  3. private access modifier
  4. private constructor
  5. protected access modifier
  6. internal access modifier
  7. protected internal access modifier
  8. public access modifier
  9. Độ truy cập và thừa kế

1. Modifier trong CSharp

Các access modifiers trong CSharp xác định độ truy cập (Phạm vi) vào dữ liệu của của các trường, phương thức, cấu tử (constructor) hoặc class.

Có 5 kiểu access modifiers trong CSharp:
  • private
  • protected
  • internal
  • protected internal
  • public

2. Tổng quan về access modifier

Độ truy cập
(Modifier)
Mô tả
private
Truy cập bị hạn chế trong phạm vi của định nghĩa Class. Đây là loại phạm vi truy cập mặc định nếu không được chính thức chỉ định
protected
Truy cập bị giới hạn trong phạm vi định nghĩa của Class và bất kỳ các class con thừa kế từ class này.
internal
Truy cập bị giới hạn trong phạm vi Assembly của dự án hiện tại.
protected internal
Truy cập bị giới hạn trong phạm vi Assembly hiện tại và trong class định nghĩa hoặc các class con.
public
Không có bất kỳ giới hạn nào khi truy cập vào các thành viên công khai (public)
Bảng minh họa dưới đây cho bạn cái nhìn tổng quan về cách sử dụng các access modifier.
Cùng Assembly
Khác Assembly
Trong class định nghĩa?
Trong class con
Ngoài class định nghĩa, ngoài class con
Trong class con
Ngoài class con
private
Y
protected
Y
Y
Y
internal
Y
Y
Y
protected internal
Y
Y
Y
public
Y
Y
Y
Y
Y
Bạn có thể hiểu chi tiết hơn theo các ví dụ dưới đây:

3. private access modifier

private access modifier chỉ cho phép truy cập trong nội bộ một class.
Bạn không thể truy cập vào các thành viên private ở bên ngoài class định nghĩa thành viên đó. CSharp sẽ thông báo lỗi tại thời điểm biên dịch class.

4. private constructor

Phương thức khởi tạo (constructor), phương thức (method), trường (field) đều được gọi là các thành viên trong class.
Nếu bạn tạo một class, và có một phương thức khởi tạo (constructor) có access modifierprivate, bạn không thể tạo một đối tượng của class này từ private constructor đó từ bên ngoài class này. Hãy xem ví dụ minh họa:

5. protected access modifier

protected access modifier có thể truy cập bên trong package, hoặc bên ngoài package nhưng phải thông qua tính kế thừa.
protected access modifier chỉ áp dụng cho field, method constructor. Nó không thể áp dụng cho class (class, interface, ..).

6. internal access modifier

internal là độ truy cập nội bộ, nó bị giới hạn trong một Assembly.

Một Assembly là chính là sản phẩm đã biên dịch của mã của bạn, thường là một DLL, nhưng EXE cũng có thể coi là một assembly. Nó là đơn vị nhỏ nhất của việc triển khai cho bất kỳ dự án .NET nào.

Assembly một cách cụ thể chứa mã .NET theo MSIL (Microsoft Intermediate language - Một ngôn ngữ trung gian) sẽ được biên dịch thành mã máy tính (Native code) ("JITted" - Được biên dịch bởi các trình biên dịch Just-In-Time) trong lần đầu tiên nó được thực thi trên máy tính,. Đó là mã đã được biên dịch cũng sẽ được lưu trữ trong Assembly và tái sử dụng cho các lần gọi tiếp theo.

7. protected internal access modifier

Độ truy cập protected internal là kết hợp giữa hai độ truy cập protectedinternal, khi một thành viên của class có độ truy cập này, bạn chỉ có thể truy cập vào thành viên đó trong cùng class định nghĩa ra nó hoặc các class con và nằm trong cùng một Assembly.

8. public access modifier

public access modifier là mạnh mẽ nhất và có thể truy cập ở mọi nơi. Nó có phạm vi truy cập rộng nhất so với các modifier khác.

9. Độ truy cập và thừa kế

Trong CSharp bạn có thể ghi đè (override) một phương thức (method) của class cha bởi một phương thức cùng tên cùng tham số, cùng kiểu trả về tại class con, tuy nhiên bạn không được phép thay đổi độ truy cập (access modifier) của nó.
Tuy nhiên, bạn có thể tạo một phương thức cùng tên cùng tham số, cùng kiểu trả về nhưng khác độ truy cập nếu sử dụng từ khóa new, thực tế đây là một phương thức khác chẳng liên quan gì tới phương thức của class cha.
Sự khác biệt giữa overridenew trong đã được giải thích trong tài liệu "Thừa kế và đa hình trong CSharp" bạn có thể xem tại: