Ý nghĩa của công cụ sửa đổi truy cập C / # được bảo vệ riêng tư có kế hoạch là gì?


133

Là một phần của tài liệu Roslyn trên GitHub, có một trang có tên là trạng thái triển khai tính năng Ngôn ngữ , với các tính năng ngôn ngữ được lên kế hoạch cho C # và VB.

Một tính năng tôi không thể quấn đầu là công cụ private protectedsửa đổi truy cập:

private protected string GetId() {  } 

Ngoài ra còn có một trang Ghi chú thiết kế ngôn ngữ C # , giải thích nhiều tính năng mới, nhưng không phải là tính năng này.

Eric Lippert nói trong một bình luận :

Lỗi của bạn là do các công cụ sửa đổi làm tăng các hạn chế. Các sửa đổi trong thực tế luôn luôn giảm các hạn chế. Hãy nhớ rằng, mọi thứ là "riêng tư" theo mặc định; chỉ bằng cách thêm các sửa đổi, bạn làm cho chúng ít bị hạn chế hơn.

Ý nghĩa của là private protectedgì? Khi nào tôi có thể sử dụng nó?


2
Lưu ý rằng có thông tin về nó theo ghi chú thiết kế ngôn ngữ VB .
Jesse Tốt

3
Nó là một ánh xạ tới MethodAttribut.FamANDAssem. C # có một ánh xạ kỳ lạ của nội bộ , nó sử dụng (Riêng tư | FamANDAssem). Và bản đồ được bảo vệ nội bộ để (Riêng tư | Gia đình). Các thuộc tính CLR là lạ.
Hans Passant

22
Tính năng đề xuất này sẽ làm cho nhận xét của tôi không chính xác.
Eric Lippert

Nhóm thiết kế C # đã xuất bản một cuộc khảo sát với cú pháp thay thế được đề xuất cho tính năng này. Một số trong số này là thú vị, như protected & internal, assembly protectedhoặc proternal(tôi hy vọng một số trong số này là trò đùa). Ngoài ra còn có chủ đề Thảo luận với một số hiểu biết tốt đẹp.
Kobi

1
Tính năng hiện được đánh dấu rút trong trạng thái triển khai Tính năng ngôn ngữ! Cá nhân tôi thích ý tưởng về cấp độ truy cập này và tôi nghĩ nó là một tính năng hữu ích. Tôi muốn sử dụng mã được bảo vệ để giữ mã của mình theo thiết kế lớp, nhưng tôi không muốn người khác viết các thư mục con hacky có quyền truy cập vào các thành viên này. IMO giải pháp tốt nhất sẽ là nếu chúng ta có thể viết protected | internalprotected & internal
Felix Keil

Câu trả lời:


98

Theo " Professional C # 2008 " của De Bill Evjen và Jay Glynn, trang 1699:

bảo vệ riêng tư - "chỉ các loại dẫn xuất trong hội đồng hiện tại"

C ++ / CLI có một tính năng tương tự - Xác định và tiêu thụ các lớp và cấu trúc (C ++ / CLI)> Khả năng hiển thị của thành viên :

private protected-hoặc- protected private- Thành viên được bảo vệ bên trong lắp ráp nhưng riêng tư bên ngoài lắp ráp.


72
Vậy đó là "được bảo vệ nội bộ" thay vì "được bảo vệ hay nội bộ"?
dùng541686

2
Bây giờ sẽ có thể có một thành viên có thể truy cập được vào các lớp dẫn xuất chấp nhận hoặc trả lại những thứ thuộc internalloại mà không yêu cầu thành viên phải tự tiếp xúc với mọi thứ trong hội đồng không?
supercat

Cảm ơn! Tôi đã không nghĩ về điều đó. Tôi thực sự có trường hợp tôi đã sử dụng công cụ sửa đổi đó, và quay trở lại internal.
Kobi

3
Sự tồn tại của đề xuất / tính năng này dường như gợi ý rằng internalkhả năng hiển thị (liên quan đến nơi lớp được xác định) thực sự trực giao với public/ protected/ privatemức độ hiển thị (liên quan đến thừa kế) và có lẽ, internalnên là công cụ sửa đổi riêng của nó tách biệt với public/ protected/ private.
jpmc26

1
@jww - Tôi không quen thuộc lắm với Java, nhưng nhiều như tôi biết packagetrong Java giống như không gian tên trong C #.
Gogutz

187

Dưới đây là tất cả các sửa đổi truy cập trong sơ đồ Venn, từ hạn chế hơn đến lăng nhăng hơn:

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

private protected: - được thêm vào C # 7.2
nhập mô tả hình ảnh ở đây

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

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

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

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


3
Nguồn hình ảnh: Access Modifier.pdn . Tôi đã sử dụng một cách khéo léo có tên Paint.Net .
Kobi

9
Những sơ đồ này đã ở đâu trong suốt cuộc đời (C #) của tôi? Họ rất xuất sắc - cảm ơn bạn!
Jon Peterson

28

Đây chỉ là để cung cấp một biểu đồ (được tạo bằng http://ashitani.jp/gv/ ) của các cấp độ truy cập khác nhau (hình ảnh không phù hợp với nhận xét).

sơ đồ sơ đồ các cấp truy cập C #

Mỗi mũi tên có nghĩa là "hạn chế hơn".

Tên CLR là Private, FamilyANDAssembly, Assembly, Family, FamilyORAssembly, Public.


Chỉnh sửa nhiều về sau: Hóa ra mức truy cập mới tốt đẹp này (với một tên thực sự nghèo nàn) cuối cùng không được đưa vào C # 6.0. Nó chỉ được hỗ trợ từ C # 7.2 (và tôi thấy bạn đã cập nhật "thẻ" câu hỏi của mình).


Chỉ có thể là tôi, nhưng những mũi tên dường như đang đi theo hướng 'ít hạn chế hơn'.
acarlon

4
@acarlon Có, vì vậy a → btrong sơ đồ có nghĩa là " ahạn chế hơn b", vì vậy bạn có thể "đọc" mũi tên là "hạn chế hơn" (đó là những gì tôi đã cố gắng giải thích), vì vậy mũi tên chỉ ra ít hạn chế nhất " phương hướng". Nhân tiện, quy ước ngược lại cho các mũi tên có thể cũng tốt như vậy, nhưng tôi phải chọn một quy ước.
Jeppe Stig Nielsen

10

Đó chỉ là một phỏng đoán, nhưng từ một cái tên bạn có thể đoán đó là một phiên bản hạn chế hơn protected, (hoặc phiên bản thoải mái hơn privatenếu bạn muốn). Và chỉ có biến thể hợp lý của nó là hạn chế protectedhành vi để lắp ráp.

Có thể sử dụng: sau đó bạn muốn có protectedđể thực hiện nội bộ, nhưng không sử dụng bên ngoài (và bạn không muốn niêm phong lớp).

PS Nó luôn tồn tại trong CLR, nhưng không tồn tại trong C # . Đó là sự kết hợp của protected internal , trích dẫn:

CLR cũng hỗ trợ loại Gia đình và lắp ráp loại truy cập. Điều này có nghĩa là phương thức có thể truy cập được từ bên trong kiểu khai báo, kiểu lồng nhau và kiểu dẫn xuất nhưng chỉ khi chúng được khai báo trong cùng một cụm. Chà, rõ ràng nhóm C # đã không nghĩ đây là một tính năng rất hữu ích nên nó không được hỗ trợ trong ngôn ngữ này.


+1 cho nhận xét CLR - Tôi dành quá nhiều thời gian cho C # và rất ít trong các ngôn ngữ .NET khác mà đôi khi tôi quên rằng chúng không giống nhau.
brichins

@DarrelHoffman cảm ơn bạn đã chú ý! Tôi đã trộn lẫn suy nghĩ của mình ở đây một chút)
Petr Abdulin

5

"Có thể" chỉ hiển thị cho các lớp con trong cùng một cụm. Điều này làm cho nó một chút hạn chế hơn protected.


1

Xem thông số kỹ thuật cho tính năng "bảo vệ riêng tư":

Ý nghĩa trực quan của bảo vệ riêng tư là có thể truy cập được trong hội đồng này bởi các loại có nguồn gốc từ lớp có chứa.

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.