'보호 된'과 '보호 된 내부'의 차이점은 무엇입니까?


244

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

답변:


402

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

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

보호 :

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

내부 :

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

내부 보호 :

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

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

... 완전성을 위해 :

비공개 :

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

공개 :

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

개인 보호 :

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


2
현재 어셈블리에 있고 외부에서 완전히 사용할 수 protected internal없도록 멤버를 가질 수 있습니까 protected?
Shimmy Weitzhandler

8
그것은 "보호되어"있지 않습니까?
CAD bloke

2
@ Shimmy : protected 메소드를 사용 하여 내부 클래스 를 가질 수 있습니다 . 그러나 전체 클래스는 외부 어셈블리에서 사용할 수 없습니다.
M4N


@Shimmy 적어도 CLR은 보호 및 내부 접근성의 교차 개념을 지원하지만 C # 언어는 지원하지 않습니다. C #은 두 개의 액세스 한정자 조합 만 지원합니다.
RBT

89

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

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

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


3
CLR이 보호 된 접근성과 내부 접근성의 교차점 개념을 지원한다는 독자에게는 FYI 일 뿐이지 만 C #에서는이를 지원하지 않습니다. C #은이 게시물에서 언급 한 것처럼이 둘의 결합 만 지원합니다.
RBT

1
독자를위한 또 다른 참고 자료 인 "동일한 어셈블리의 서브 클래스"는 private protectedC # 7.2에 소개 된 액세스 수정자를 사용하여 달성 할 수 있습니다
LordWilmore

52

-답변 답변 2019-

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

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


4
아름다운 대답은 각 액세스 수정 자 간의 차이점을 매우 명확하게 전달합니다.
e_i_pi

23

실제로 방법에 대해 :

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

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

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


1
나는 OR을 사용하여 둘 다 사실이 아닌 원인을 표현할 것입니다.
Brian Rasmussen

"보호 된"에 대한 설명에서 "기본 클래스 동작 변경"부분에 완전히 동의하지는 않습니다. 나는 이것이 기본 클래스에서 "가상"과 파생 클래스에서 "재정의"를 사용하는 곳이라고 말하고 싶습니다.
M4N

멤버를 protectedAND 로 표시하는 방법이 internal있습니까?
Shimmy Weitzhandler

@Shimmy : 그렇습니다 protected internal.
abatishchev

1
2 년 후 @Shimmy, 그렇습니다. 이제 C # 7.2에 방법이 있습니다. 해당 호출 private protected docs.microsoft.com/en-us/dotnet/csharp/language-reference/...
파울리 Østerø

10

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

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

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

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

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

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

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

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

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

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

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


1
개인 보호는 이제 기본적으로 내부 및 보호되는 C # 7.2에 추가되었습니다.
Pauli Østerø

7

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

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


3

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

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

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

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


1

보호 회원

포함 된 클래스 (선언 된 클래스)와 어셈블리 내 및 어셈블리 외부의 파생 클래스에서만 사용할 수있는 클래스의 보호 된 멤버입니다.

어셈블리 외부에있는 클래스가 해당 클래스 만 상속하여 다른 어셈블리의 보호 된 멤버를 사용할 수 있는지 여부를 의미합니다.

해당 클래스를 상속하여 보호 된 멤버를 어셈블리 외부에 노출시키고 파생 클래스에서만 사용할 수 있습니다.

참고 : 파생 클래스의 개체를 사용하여 보호 된 멤버에 액세스 할 수 없습니다.

내부 회원

클래스의 내부 멤버는 개체를 만들거나 파생 클래스에서 어셈블리 내에서 사용 가능하거나 액세스 할 수 있거나 어셈블리 내의 모든 클래스에서 액세스 가능하다고 말할 수 있습니다.

참고 : 객체 생성 또는 파생 클래스를 사용하여 어셈블리 외부에서 내부 멤버에 액세스 할 수 없습니다.

내부 보호

보호 된 내부 액세스 수정자는 보호 또는 내부의 조합입니다.

보호 된 내부 구성원은 개체 생성을 선언했거나 해당 클래스를 상속 한 전체 어셈블리 내에서 사용할 수 있습니다. 파생 클래스에서만 어셈블리 외부에서 액세스 할 수 있습니다.

참고 : 내부 보호 멤버는 동일한 어셈블리 내에서 내부로 작동하고 어셈블리 외부에서는 보호로 작동합니다.


1

public - public으로 선언 된 멤버 (함수 및 변수)는 어디서나 액세스 할 수 있습니다.

개인 -개인 구성원은 수업 외부에서 액세스 할 수 없습니다. 이는 멤버의 기본 액세스 지정자입니다. 즉 멤버 (변수 또는 함수)에 대한 액세스 지정자를 지정하지 않으면 개인용으로 간주됩니다. 따라서 문자열 PhoneNumber; 개인 문자열 PhoneNumber와 같습니다.

protected-보호 된 멤버는 하위 클래스에서만 액세스 할 수 있습니다.

내부 -동일한 어셈블리 내에서만 액세스 할 수 있습니다.

보호 된 내부 -파생 클래스뿐만 아니라 동일한 어셈블리 내에서 액세스 할 수 있습니다.


0

멤버 또는 형식을 다른 어셈블리의 파생 클래스에서 동시에 사용하려는 경우 보호 된 내부 최상의 제품군은 선언 된 클래스에서 파생되지 않고 부모 어셈블리의 멤버 또는 형식을 사용하려고합니다. 또한 다른 클래스에서 파생되지 않은 멤버 또는 유형 만 사용하려는 경우 동일한 어셈블리에서 내부 만 사용할 수 있습니다.

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