계획된 "개인 보호"C # 액세스 수정 자의 의미는 무엇입니까?


133

GitHub 에 대한 Roslyn 문서의 일부로 C # 및 VB에 대해 계획된 언어 기능이있는 언어 기능 구현 상태 페이지가 있습니다.

머리를 감쌀 수 없었던 한 가지 기능은 private protected액세스 수정 자입니다.

private protected string GetId() {  } 

C # 언어 디자인 노트 페이지에는 많은 새로운 기능을 설명하지만이 기능은 설명하지 않습니다.

에릭 리퍼 (Eric Lippert)는 다음과 같이 언급했다 .

오류가 수정자를 증가하는 제한 사항으로 생각하고 있습니다. 실제로 수정자는 항상 제한을 줄입니다. 사물은 기본적으로 "개인"입니다. 수정자를 추가해야만 제한이 줄어 듭니다.

의 의미는 private protected무엇입니까? 언제 사용할 수 있습니까?


2
VB 언어 디자인 노트 에는 이에 대한 정보가 있습니다 .
Jesse Good

3
MethodAttributes.FamANDAssem에 대한 매핑입니다. C #에는 internal 의 이상한 매핑이 있으며 (Private | FamANDAssem)을 사용합니다. 그리고 내부 보호 는 (개인 | 가족)에 매핑됩니다. CLR 속성이 이상합니다.
Hans Passant

22
이 제안 된 기능은 내 의견을 잘못 만들 것입니다.
Eric Lippert

C # 디자인 팀은 이 기능에 대한 대체 구문제안 하는 설문 조사를 게시했습니다 . 이들 중 일부는 같은, 흥미 protected & internal, assembly protected또는 proternal(I 이들 중 일부는 농담 바랍니다). 좋은 통찰력을 가진 토론 스레드 도 있습니다 .
Kobi

1
이제 언어 기능 구현 상태에서 기능이 철회되었습니다! 개인적으로 저는이 액세스 수준에 대한 아이디어를 좋아하며 유용한 기능이라고 생각합니다. 클래스 디자인에 따라 코드를 유지하기 위해 protected를 사용하고 싶지만 다른 사람들 이이 멤버에 액세스 할 수있는 해킹 된 sublasses를 작성하고 싶지 않습니다. IMO 가장 좋은 방법은 우리가 쓸 수있는 경우가 될 것입니다 protected | internalprotected & internal
펠릭스 카일

답변:


98

1699 페이지의 De Bill Evjen과 Jay Glynn의 " Professional C # 2008 "에 따르면 :

개인 보호- "현재 어셈블리 내에서 파생 된 유형 만"

C ++ / CLI에는 클래스 및 구조 정의 및 사용 (C ++ / CLI)> 멤버 표시 기능과 유사한 기능이 있습니다 .

private protected-또는 protected private-구성원은 어셈블리 내부에서 보호되지만 어셈블리 외부에서는 비공개입니다.


72
이 "보호 그래서 하고 대신 내부" "보호 또는 내부"?
user541686

2
파생 클래스에 액세스 할 수 internal있는 멤버가 멤버 자체를 어셈블리의 모든 항목에 노출시키지 않고도 형식의 항목을 수락하거나 반환 할 수 있습니까?
supercat

감사! 나는 그것에 대해 생각하지 않았다. 나는 실제로 그 수정자를 사용했을 때를 가지고 있었고 다시 넘어졌습니다 internal.
Kobi

3
이 제안 / 기능의 존재는 internal(클래스가 정의 된 위치와 관련된) 가시성이 실제로 public/ protected/ private가시성 (상속과 관련됨)과 직교하며 아마도 / / internal와 별도의 수정자가되어야 함 을 암시하는 것으로 보입니다 . publicprotectedprivate
jpmc26

1
@jww-Java에 익숙하지 않지만 Java에서 알고 package있는 것처럼 C #의 네임 스페이스와 비슷합니다.
Gogutz

187

Venn 다이어그램의 모든 액세스 수정자는 제한에서 무차별까지입니다.

private:
여기에 이미지 설명을 입력하십시오

private protected: -C # 7.2에 추가됨
여기에 이미지 설명을 입력하십시오

internal:
여기에 이미지 설명을 입력하십시오

protected:
여기에 이미지 설명을 입력하십시오

protected internal:
여기에 이미지 설명을 입력하십시오

public:
여기에 이미지 설명을 입력하십시오


3
소스 이미지 : Access Modifiers.pdn . Paint.Net 이라는 적절한 이름을 사용했습니다 .
Kobi

9
이 다이어그램은 모두 내 (C #) 삶의 어디에 있습니까? 그들은 우수합니다-감사합니다!
존 피터슨

28

이것은 접근성 수준이 다른 ( http://ashitani.jp/gv/ 로 만든 ) 그래프를 제공하기위한 것입니다 (이미지는 주석에 맞지 않습니다).

C # 액세스 레벨의 다이어그램 다이어그램

각 화살표는 "보다 제한적"을 의미합니다.

CLR은 이름은 Private, FamilyANDAssembly, Assembly, Family, FamilyORAssembly, Public.


훨씬 나중에 편집 :이 멋진 새로운 액세스 수준 (실제로 나쁜 이름)은 C # 6.0에 포함 되지 않았습니다 . C # 7.2에서만 지원되며 질문 "태그"를 업데이트 한 것으로 확인됩니다.


그것은 나일지도 모르지만 화살표는 '보다 제한적이지 않은'방향으로 가고있는 것 같습니다.
acarlon

4
@acarlon 예, 따라서 a → b다이어그램에서 " a는 " 보다 제한적 "을 의미 b하므로"보다 제한적 "("설명하려고 시도한 것 ")으로 화살표를"읽을 "수 있으므로 화살표는 가장 제한적이지 않습니다" 방향". 그건 그렇고 화살표에 대한 반대의 관습은 좋았을 수도 있지만, 나는 하나의 관습을 선택해야했습니다.
Jeppe Stig Nielsen

10

그것은 추측 일뿐이지만 이름에서 더 제한된 버전 protected(또는 private원하는 경우 더 편안한 버전) 일 수 있습니다. 그리고 그것의 합리적인 변형 만이 protected행동을 조립으로 제한 합니다.

가능한 사용법 : protected내부 구현을 원하지만 외부 사용을 원치 않습니다 (그리고 클래스를 봉인하고 싶지 않음).

PS 항상 CLR에는 있었지만 C #에는 없었습니다 . 이 조합의 protected internal , 인용 :

CLR은 또한 "가족 및 조립"액세스 유형을 지원합니다. 즉, 선언 형식, 중첩 및 파생 형식 내에서 동일한 어셈블리에서 선언 된 경우에만 메서드에 액세스 할 수 있습니다. C # 팀은이 기능을 매우 유용한 기능으로 생각하지 않았기 때문에이 언어에서는 지원되지 않습니다.


CLR 주석의 경우 +1-요즘 C #에서 많은 시간을 보내고 요즘 다른 .NET 언어에서는 시간이 거의 걸리지 않으므로 때로는 같은 것이 아니라는 것을 잊습니다.
brichins

@DarrelHoffman 감사합니다! 나는 여기에 내 생각을 조금 섞었다)
Petr Abdulin

5

"어쩌면"같은 어셈블리에있는 서브 클래스에서만 볼 수 있습니다. 이보다 약간 제한되어 protected있습니다.


1

"개인 보호"기능에 대한 사양 을 참조하십시오 .

개인 보호의 직관적 인 의미는“이 클래스 내에서 포함 클래스에서 파생 된 유형에 의해 액세스 가능”입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.