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/ 로 만든 ) 그래프를 제공하기위한 것입니다 (이미지는 주석에 맞지 않습니다).
각 화살표는 “보다 제한적”을 의미합니다.
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
있습니다.