[C#] ‘보호 된’과 ‘보호 된 내부’의 차이점은 무엇입니까?

누군가 C #에서 ‘protected’및 ‘protected internal’수정 자의 차이점을 자세히 설명해 주시겠습니까? 그들은 같은 방식으로 행동하는 것 같습니다.



답변

A는 수정은 “보호 된 내부”액세스 노조 모두 “보호”와 “내부”수정의.

에서 MSDN, 액세스 수정 자 (C #을 가이드 프로그래밍) :

보호 :

유형 또는 멤버는 동일한 클래스 또는 구조체의 코드 또는 해당 클래스에서 파생 된 클래스에서만 액세스 할 수 있습니다.

내부 :

유형이나 멤버는 동일한 어셈블리의 코드로 액세스 할 수 있지만 다른 어셈블리에서는 액세스 할 수 없습니다.

내부 보호 :

형식 또는 멤버는 선언 된 어셈블리의 모든 코드 또는 다른 어셈블리의 파생 클래스 내 에서 액세스 할 수 있습니다 . 다른 어셈블리의 액세스는 보호 된 내부 요소가 선언 된 클래스에서 파생 된 클래스 선언 내에서 이루어져야하며 파생 클래스 유형의 인스턴스를 통해 발생해야합니다.

참고 : protected internal수단 ” protectedOR internal“(동일한 어셈블리의 모든 클래스 또는 파생 된 클래스 – 그것은 다른 어셈블리에있는 경우에도).

… 완전성을 위해 :

비공개 :

유형 또는 멤버는 동일한 클래스 또는 구조체의 코드로만 액세스 할 수 있습니다.

공개 :

형식이나 멤버는 동일한 어셈블리 나 다른 어셈블리를 참조하는 다른 코드로 액세스 할 수 있습니다.

개인 보호 :

액세스는 현재 어셈블리 내의 포함 클래스에서 파생 된 포함 클래스 또는 유형으로 제한됩니다.
( C # 7.2부터 사용 가능 )


답변

protected 모든 어셈블리의 하위 클래스에서 사용할 수 있습니다.

protected internalprotected, 동일한 어셈블리의 모든 항목에 액세스 할 수 있습니다.

중요한 것은 “동일한 어셈블리의 서브 클래스”를 의미하는 것이 아니라 교차점이 아닌 두 요소의 합집합입니다.


답변

-답변 답변 2019-

아래 표에서 접근성에 차이가 있음을 찾을 수 있습니다.

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


답변

실제로 방법에 대해 :

protected- 상속 된 클래스에 액세스 가능합니다. 그렇지 않은 경우는 비공개입니다.

internal- 어셈블리 내부의 클래스에 대해서만 공용, 그렇지 않으면 개인용.

protected internal -protected 또는 internal-메서드는 상속 된 클래스 어셈블리 내의 모든 클래스에 액세스 할 수 있음을 의미 합니다.


답변

“보호 된 내부”접근 자의 범위를 이해하는 데 여전히 많은 혼란이 있지만, 대부분 정의가 올바르게 정의되어 있습니다. 이것은 “보호 된”과 “보호 된 내부”의 혼란을 이해하는 데 도움이되었습니다.

공개 는 실제로 어셈블리 내부 및 외부에 공개됩니다 ( 공개 내부 / 공개 외부 )

protected 는 실제로 어셈블리 내부 및 외부에서 보호됩니다 (내부 보호 / 외부 보호 ) (최상위 클래스에서는 허용되지 않음)

private 은 실제로 어셈블리 내부 및 외부에서 비공개입니다 ( private internal / private external ) (최상위 클래스에서는 허용되지 않음)

internal 은 어셈블리 내부에서 실제로 공개이지만 private과 같이 어셈블리 외부에서 제외됩니다 ( 공개 내부 / 제외 외부 )

내부 보호 는 어셈블리 내부에서 실제로 공개되지만 어셈블리 외부에서 보호됩니다 ( 공개 내부 / 외부 보호 ) (최상위 클래스에서는 허용되지 않음)

보시다시피 보호 내부 는 매우 이상한 짐승입니다. 직관적이지 않습니다.

이제 Microsoft가 왜 ( 보호 된 내부 / 제외 된 외부 )를 만들지 않았는지 , 또는 “개인 보호”또는 “내부 보호”라고 생각 하는 이유는 무엇입니까? lol. 불완전한 것 같습니까?

보호, 내부 또는 개인 유형 내에 공용 또는 보호 된 내부 중첩 멤버를 중첩 할 수 있다는 사실이 혼란에 추가됩니다. 외부 어셈블리 액세스를 제외하는 내부 클래스 내부의 중첩 된 “보호 된 내부”에 액세스하는 이유는 무엇입니까?

MS는 이러한 중첩 유형은 상위 유형 범위에 의해 제한되지만 컴파일러가 말하는 것은 아닙니다. 범위를 어셈블리로 제한해야하는 내부 클래스 내부에서 보호 된 내부를 컴파일 할 수 있습니다.

나에게 이것은 불완전한 디자인처럼 느껴집니다. 상속을 명확하게 고려할뿐만 아니라 중첩 형식의 보안 및 계층도 고려하는 시스템에 대한 모든 형식의 범위를 단순화해야합니다. 이로 인해 불완전한 범위 지정 시스템을 기반으로 유형 및 멤버의 액세스 가능성을 발견하는 대신 객체 공유가 매우 직관적이고 세분화되었습니다.


답변

protected : 변수 또는 메소드는 모든 클래스의 하위 클래스에서만 사용할 수 있습니다.

내부 보호 : 모든 어셈블리의 하위 클래스 동일한 어셈블리의 모든 클래스에서 사용 가능


답변

이 용어에 대한 명확한 정의를 읽었습니다.

보호 : 액세스는 클래스 정의 및 클래스에서 상속되는 모든 클래스로 제한됩니다. 유형 또는 멤버는 동일한 클래스 또는 구조체 또는 해당 클래스에서 파생 된 클래스의 코드로만 액세스 할 수 있습니다.

내부 : 액세스는 현재 프로젝트 어셈블리 내에 정의 된 클래스로만 제한됩니다. 유형 또는 멤버는 동일한 클래스의 코드로만 액세스 할 수 있습니다.

내부 보호 : 액세스는 클래스를 포함하는 현재 어셈블리 또는 유형으로 제한됩니다.