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

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

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

private protected string GetId() {  } 

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

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

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

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



답변

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

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

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

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


답변

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

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

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

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

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

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

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


답변

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

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

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

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


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


답변

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

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

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

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


답변

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


답변

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

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


답변