Các sửa đổi truy cập mặc định trong C # là gì?


384

Công cụ sửa đổi truy cập mặc định cho các lớp, phương thức, thành viên, hàm tạo, đại biểu và giao diện là gì?

Câu trả lời:


486

Quyền truy cập mặc định cho mọi thứ trong C # là "quyền truy cập bị hạn chế nhất mà bạn có thể khai báo cho thành viên đó" .

Ví dụ:

namespace MyCompany
{
    class Outer
    {
        void Foo() {}
        class Inner {}
    }
}

tương đương với

namespace MyCompany
{
    internal class Outer
    {
        private void Foo() {}
        private class Inner {}
    }
}

Một loại ngoại lệ cho điều này là làm cho một phần của một thuộc tính (thường là setter) bị hạn chế hơn khả năng truy cập được khai báo của chính thuộc tính:

public string Name
{
    get { ... }
    private set { ... } // This isn't the default, have to do it explicitly
}

Đây là những gì đặc tả C # 3.0 đã nói (phần 3.5.1):

Tùy thuộc vào bối cảnh diễn ra một tuyên bố thành viên, chỉ một số loại khả năng truy cập được khai báo được cho phép. Hơn nữa, khi một tuyên bố thành viên không bao gồm bất kỳ công cụ sửa đổi truy cập nào, bối cảnh trong đó việc khai báo diễn ra sẽ xác định khả năng truy cập được khai báo mặc định.

  • Không gian tên ngầm có khả năng truy cập công khai. Không có sửa đổi truy cập được cho phép trên khai báo không gian tên.
  • Các loại được khai báo trong các đơn vị biên dịch hoặc không gian tên có thể có khả năng truy cập được khai báo công khai hoặc nội bộ và mặc định cho khả năng truy cập được khai báo nội bộ.
  • Các thành viên của lớp có thể có bất kỳ loại nào trong năm loại khả năng truy cập được khai báo và mặc định là khả năng truy cập được khai báo riêng. (Lưu ý rằng một loại được khai báo là thành viên của một lớp có thể có bất kỳ loại nào trong năm loại khả năng truy cập được khai báo, trong khi một loại được khai báo là thành viên của không gian tên chỉ có thể có khả năng truy cập được khai báo công khai hoặc nội bộ.)
  • Các thành viên cấu trúc có thể có khả năng truy cập khai báo công khai, nội bộ hoặc riêng tư và mặc định thành khả năng truy cập khai báo riêng tư vì các cấu trúc được niêm phong ngầm. Các thành viên cấu trúc được giới thiệu trong một cấu trúc (nghĩa là không được kế thừa bởi cấu trúc đó) không thể có khả năng truy cập khai báo nội bộ được bảo vệ hoặc bảo vệ. (Lưu ý rằng một loại được khai báo là thành viên của cấu trúc có thể có khả năng truy cập khai báo công khai, nội bộ hoặc riêng tư, trong khi một loại được khai báo là thành viên của không gian tên chỉ có thể có khả năng truy cập khai báo công khai hoặc nội bộ.)
  • Các thành viên giao diện mặc nhiên có khả năng truy cập công khai. Không có sửa đổi truy cập được cho phép trên khai báo thành viên giao diện.
  • Thành viên liệt kê ngầm có khả năng tiếp cận công khai. Không có sửa đổi truy cập được cho phép trên khai báo thành viên liệt kê.

(Lưu ý rằng các loại lồng nhau sẽ nằm dưới các phần "thành viên lớp" hoặc "thành viên cấu trúc" - và do đó mặc định là khả năng hiển thị riêng tư.)


154
top level class: internal
method: private
members (unless an interface or enum): private (including nested classes)
members (of interface or enum): public
constructor: private (note that if no constructor is explicitly defined, a public default constructor will be automatically defined)
delegate: internal
interface: internal
explicitly implemented interface member: public!

13
Điều này không làm rõ rằng nếu một lớp cũng là một thành viên (do là một kiểu lồng nhau) thì nó mặc định là riêng tư. Ngoài ra, các thành viên của một giao diện và enum luôn được công khai.
Jon Skeet

1
@niry Không, nó không riêng tư. Nó là công khai. Nó chỉ không nhận được một khe cắm trong các loại thực hiện, vì vậy nếu class Foo : IFoo { IFoo.M() {} } ... Foo a = new Foo();bạn không thể truy cập Mvới a.M(), tuy nhiên bạn có thể truy cập nó với (a as IFoo).M(). (Kiểm tra thông số kỹ thuật để biết thêm thông tin về các chi tiết cụ thể)
M.Stramm

130

Câu trả lời ngắn: quyền truy cập tối thiểu có thể (câu trả lời của Jon Skeet).

Câu trả lời dài:

Các loại không lồng nhau, liệt kê và khả năng truy cập của đại biểu ( chỉ có thể có khả năng truy cập nội bộ hoặc công khai )

                     | Default   | Permitted declared accessibilities
------------------------------------------------------------------
namespace            | public    | none (always implicitly public)

enum                 | public    | none (always implicitly public)

interface            | internal  | public, internal

class                | internal  | public, internal

struct               | internal  | public, internal

delegate             | internal  | public, internal

Kiểu lồng nhau và quyền truy cập thành viên

                     | Default   | Permitted declared accessibilities
------------------------------------------------------------------
namespace            | public    | none (always implicitly public)

enum                 | public    | none (always implicitly public)

interface            | public    | none

class                | private   | All¹

struct               | private   | public, internal, private²

delegate             | private   | All¹

constructor          | private   | All¹

interface member     | public    | none (always implicitly public)

method               | private   | All¹

field                | private   | All¹

user-defined operator| none      | public (must be declared public)

Tất cả === công khai, được bảo vệ, nội bộ, riêng tư, được bảo vệ nội bộ

² cấu trúc không thể kế thừa từ các cấu trúc hoặc lớp (mặc dù chúng có thể, giao diện), do đó được bảo vệ không phải là một sửa đổi hợp lệ

Khả năng truy cập của loại lồng nhau phụ thuộc vào miền khả năng truy cập của nó, được xác định bởi cả khả năng truy cập được khai báo của thành viên và miền khả năng truy cập của loại có chứa ngay lập tức. Tuy nhiên, miền khả năng truy cập của loại lồng nhau không thể vượt quá loại có chứa.

Lưu ý: CIL cũng có quy định về bảo vệ và nội bộ (trái ngược với bảo vệ hiện có "hoặc" nội bộ), nhưng theo hiểu biết của tôi thì hiện tại không có sẵn để sử dụng trong C #.


Xem:

http://msdn.microsoft.com/en-us/l
Library /
bao1awy.aspx chúng tôi / thư viện / cx03xt0t.aspx
(Người đàn ông tôi yêu URI của Microsoft ...)


12

Hãy xem Công cụ sửa đổi truy cập (Hướng dẫn lập trình C #)

Khả năng truy cập lớp và cấu trúc

Các lớp và cấu trúc được khai báo trực tiếp trong một không gian tên (nói cách khác, không được lồng trong các lớp hoặc cấu trúc khác) có thể là công khai hoặc nội bộ. Internal là mặc định nếu không có sửa đổi truy cập được chỉ định.

Các thành viên cấu trúc, bao gồm các lớp và cấu trúc lồng nhau, có thể được khai báo là công khai, nội bộ hoặc riêng tư. Các thành viên của lớp, bao gồm các lớp và cấu trúc lồng nhau, có thể là công khai, được bảo vệ nội bộ, được bảo vệ, nội bộ, bảo vệ riêng tư hoặc riêng tư. Mức truy cập cho các thành viên lớp và các thành viên cấu trúc, bao gồm các lớp và cấu trúc lồng nhau, theo mặc định là riêng tư. Các kiểu lồng nhau không thể truy cập từ bên ngoài kiểu chứa.

Các lớp dẫn xuất không thể có khả năng truy cập lớn hơn các loại cơ sở của chúng. Nói cách khác, bạn không thể có lớp B công khai xuất phát từ lớp nội bộ A. Nếu điều này được cho phép, nó sẽ có tác dụng làm cho A công khai, bởi vì tất cả các thành viên được bảo vệ hoặc nội bộ của A đều có thể truy cập được từ lớp dẫn xuất.

Bạn có thể kích hoạt các hội đồng cụ thể khác để truy cập các loại nội bộ của mình bằng cách sử dụng InternalsVisibleToAttribute. Để biết thêm thông tin, xem Hội đồng bạn bè.

Khả năng tiếp cận thành viên của lớp và cấu trúc

Các thành viên của lớp (bao gồm các lớp và cấu trúc lồng nhau) có thể được khai báo với bất kỳ loại nào trong sáu loại truy cập. Các thành viên cấu trúc không thể được khai báo là được bảo vệ vì các cấu trúc không hỗ trợ kế thừa.

Thông thường, khả năng truy cập của một thành viên không lớn hơn khả năng tiếp cận của loại có chứa nó. Tuy nhiên, một thành viên công khai của một lớp bên trong có thể có thể truy cập được từ bên ngoài tổ hợp nếu thành viên đó thực hiện các phương thức giao diện hoặc ghi đè các phương thức ảo được định nghĩa trong lớp cơ sở công cộng.

Loại của bất kỳ thành viên nào là một lĩnh vực, tài sản hoặc sự kiện ít nhất phải có thể truy cập được như chính thành viên đó. Tương tự, kiểu trả về và kiểu tham số của bất kỳ thành viên nào là phương thức, bộ chỉ mục hoặc đại biểu phải ít nhất có thể truy cập được như chính thành viên đó. Ví dụ, bạn không thể có một phương thức công khai M trả về một lớp C trừ khi C cũng là công khai. Tương tự, bạn không thể có thuộc tính được bảo vệ loại A nếu A được khai báo là riêng tư.

Các toán tử do người dùng định nghĩa phải luôn được khai báo là công khai và tĩnh. Để biết thêm thông tin, xem Quá tải toán tử.

Quyết toán không thể có sửa đổi khả năng truy cập.

Các loại khác

Các giao diện được khai báo trực tiếp trong một không gian tên có thể được khai báo là công khai hoặc nội bộ và, giống như các lớp và cấu trúc, giao diện mặc định cho truy cập nội bộ. Các thành viên giao diện luôn được công khai vì mục đích của giao diện là cho phép các loại khác truy cập vào một lớp hoặc cấu trúc. Không có sửa đổi truy cập có thể được áp dụng cho các thành viên giao diện.

Các thành viên liệt kê luôn ở chế độ công khai và không có công cụ sửa đổi truy cập nào có thể được áp dụng.

Các đại biểu hành xử như các lớp và cấu trúc. Theo mặc định, họ có quyền truy cập nội bộ khi được khai báo trực tiếp trong một không gian tên và quyền truy cập riêng khi được lồng.


8

Lớp là nội bộ theo mặc định.

  • Thành viên lớp là tin theo mặc định.

Giao diện là nội bộ theo mặc định.

  • Các thành viên giao diện được công khai theo mặc định. (Các giao diện sẽ không cho phép chúng tôi chỉ định bất kỳ loại quyền truy cập nào cho các thành viên của nó.)

    Lưu ý: Nếu bạn cố gắng chỉ định bất kỳ trình xác định truy cập nào cho các thành viên của giao diện thì nó sẽ hiển thị lỗi biên dịch.

Struct là Internal theo mặc định.

  • Các thành viên cấu trúc là riêng tư theo mặc định.

5

Tôi muốn thêm một số liên kết tài liệu. Kiểm tra chi tiết hơn ở đây .

nhập mô tả hình ảnh ở đây


1
lớp mặc định là nội bộ và không riêng tư.
Baahubali

1
Trường hợp tôi viết lớp là riêng tư?
Asif Mushtaq

Bảng này chỉ hợp lệ cho các loại lồng nhau.
BlueSilver

lớp là nội bộ theo mặc định và lớp bên trong không gian tên không thể là riêng tư. nhưng lớp bên trong một lớp (lớp lồng nhau) có thể là riêng tư
Arun

Công cụ sửa đổi truy cập của Giao diện là Nội bộ theo mặc định.
Kamala Hanchinal

4

Câu trả lời đơn giản nhất là như sau .....

Tất cả các thành viên trong C # luôn lấy công cụ sửa đổi có thể truy cập LEAST theo mặc định.

Đó là lý do tại sao tất cả các lớp cấp cao nhất trong một hội đồng theo mặc định là "nội bộ", có nghĩa là chúng được công khai cho hội đồng mà chúng tham gia, nhưng riêng tư hoặc bị loại trừ khỏi quyền truy cập vào các hội đồng bên ngoài. Tùy chọn khác duy nhất cho một lớp cấp cao nhất là công khai dễ truy cập hơn. Đối với các kiểu lồng nhau, tất cả đều riêng tư ngoại trừ một vài trường hợp ngoại lệ hiếm hoi như thành viên của enum và giao diện chỉ có thể công khai. Vài ví dụ. Trong trường hợp các lớp và giao diện cấp cao nhất, mặc định là:

lớp Động vật giống như lớp bên trong Động vật

giao diện Động vật giống như giao diện công cộng Động vật

Trong trường hợp các lớp và giao diện lồng nhau (các kiểu bên trong), mặc định là:

lớp Động vật giống như lớp tư nhân Động vật

Giao diện Động vật giống như giao diện riêng Động vật

Nếu bạn chỉ cho rằng mặc định luôn là riêng tư nhất, thì bạn không cần sử dụng bộ truy cập cho đến khi bạn cần thay đổi mặc định. Dễ dàng.



0

Cấp độ không gian tên: internal

Cấp độ loại: private

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.