'보호됨'과 '보호됨 내부'의 차이점은 무엇입니까?
누가 그것들 사이의 차이점을 설명해 줄 수 있습니까?protected
그리고.protected internal
C#의 수식어?그들의 행동은 똑같아 보입니다.
"보호된 내부" 액세스 한정자는 "보호된" 및 "내부" 한정자의 결합입니다.
보호됨:
유형 또는 멤버는 동일한 클래스 또는 구조체 또는 해당 클래스에서 파생된 클래스의 코드로만 액세스할 수 있습니다.
내부:
유형 또는 멤버는 동일한 어셈블리의 모든 코드로 액세스할 수 있지만 다른 어셈블리에서는 액세스할 수 없습니다.
보호된 내부:
형식 또는 멤버는 선언된 어셈블리의 모든 코드를 통해 액세스하거나 다른 어셈블리의 파생 클래스 내에서 액세스할 수 있습니다.다른 어셈블리에서 액세스하려면 보호된 내부 요소가 선언된 클래스에서 파생된 클래스 선언 내에서 액세스해야 하며, 파생된 클래스 유형의 인스턴스를 통해 액세스해야 합니다.
참고:protected internal
미의:protected
ORinternal
(같은 어셈블리의 모든 클래스 또는 파생 클래스 - 다른 어셈블리에 있더라도).
...완전성을 위해:
비공개:
형식 또는 구성원은 동일한 클래스 또는 구조체의 코드로만 액세스할 수 있습니다.
공개:
유형 또는 멤버는 동일한 어셈블리 또는 이를 참조하는 다른 어셈블리의 다른 코드를 통해 액세스할 수 있습니다.
개인 보호:
현재 어셈블리 내의 포함 클래스에서 파생된 포함 클래스 또는 유형으로 액세스가 제한됩니다.
(C# 7.2 이후 사용 가능)
이 표는 차이를 보여줍니다. protected internal
는 와동합다니와 .protected
동일한 어셈블리의 다른 클래스에서도 액세스를 허용한다는 점을 제외합니다.
protected
모든 어셈블리의 모든 하위 클래스에서 사용할 수 있습니다.
protected internal
이 다입니까?protected
또한 동일한 어셈블리의 모든 항목이 액세스할 수 있습니다.
중요한 것은 "같은 어셈블리의 하위 클래스"를 의미하는 것이 아니라 교차점이 아닌 두 개의 결합이라는 것입니다.
실제로는 방법에 대해:
보호됨 - 상속된 클래스에 액세스할 수 있으며, 그렇지 않으면 비공개입니다.
내부 - 어셈블리 내부의 클래스에 대해서만 공용이며, 그렇지 않은 경우 비공개입니다.
protected internal - 보호됨 또는 내부 - 메서드가 상속된 클래스와 어셈블리 내의 모든 클래스에 액세스할 수 있게 됨을 의미합니다.
"보호된 내부" 접근자의 범위를 이해하는 데는 여전히 많은 혼란이 있지만 대부분의 접근자는 정확하게 정의되어 있습니다.이를 통해 "보호됨"과 "보호된 내부"의 혼동을 이해할 수 있었습니다.
공공은 정말로 의회 내외부에서 공공입니다(공공 내부/공공 외부).
protected는 어셈블리 내부 및 외부에서 실제로 보호됨(보호됨 내부/보호됨 외부)(최상위 클래스에서는 허용되지 않음)
private는 어셈블리 내부 및 외부(private internal/private external)에서 실제로 비공개입니다(상위 클래스에서는 허용되지 않음).
내부는 어셈블리 내부에서 실제로 공개되지만 비공개처럼 어셈블리 외부에서 제외됩니다(공공 내부/제외 외부).
protected internal은 어셈블리 내부에서 실제로 공개되지만 어셈블리 외부에서는 보호됨(public internal/protected internal)
보시다시피 보호된 내부는 매우 이상한 동물입니다.직관적이지 않습니다.
이제 Microsoft는 왜 (보호된 내부/제외된 외부)를 만들지 않았는지, 아니면 일종의 "개인 보호" 또는 "내부 보호"를 만들지 않았는지에 대한 질문이 시작됩니다. 하하.불완전한 것 같습니까?
또한 공용 또는 보호된 내부 중첩 구성원을 보호된 유형, 내부 또는 개인 유형 내에 중첩할 수 있다는 점도 혼동을 가중시킵니다.외부 어셈블리 액세스를 제외한 내부 클래스 내의 중첩된 "보호된 내부"에 액세스하는 이유는 무엇입니까?
Microsoft는 이러한 중첩된 유형이 상위 유형 범위에 의해 제한된다고 말하지만 컴파일러는 그렇게 말하지 않습니다.범위를 어셈블리로만 제한해야 하는 내부 클래스 내에서 보호된 내부를 컴파일할 수 있습니다.
저에게 이것은 불완전한 디자인처럼 느껴집니다.그들은 상속뿐만 아니라 중첩된 유형의 보안 및 계층 구조를 명확하게 고려하는 시스템으로 모든 유형의 범위를 단순화해야 합니다.이를 통해 불완전한 범위 지정 시스템을 기반으로 유형과 구성원의 접근성을 발견하는 대신 객체를 매우 직관적이고 세분화할 수 있었습니다.
보호됨: 변수 또는 메서드는 하위 클래스에만 사용할 수 있습니다(어셈블리에서).
보호된 내부: 모든 어셈블리의 하위 클래스 및 동일한 어셈블리 내의 모든 클래스에서 사용 가능
저는 이 용어들에 대한 매우 명확한 정의를 읽었습니다.
보호됨 : 클래스 정의 내 및 클래스에서 상속되는 모든 클래스로 액세스가 제한됩니다.유형 또는 멤버는 동일한 클래스 또는 구조체의 코드 또는 해당 클래스에서 파생된 클래스에서만 액세스할 수 있습니다.
내부 : 현재 프로젝트 어셈블리 내에서 정의된 클래스로만 액세스가 제한됩니다.유형 또는 멤버는 동일한 클래스의 코드로만 액세스할 수 있습니다.
Protected-Internal : 현재 어셈블리 또는 포함 클래스에서 파생된 형식으로 액세스가 제한됩니다.
대해생다에 대해 생각해 .protected internal
수식어접속 수식어)를 protected
,그리고.internal
한 필드,방법에 .) 같은 필드, 속성 또는 메서드에 있습니다.
현실 세계에서, 우리가 사람들이 박물관을 방문할 수 있는 특권을 발행하고 있다고 상상해 보십시오.
- 도시 내 모든 사람은 박물관(내부)을 방문할 수 있습니다.
- 부모님이 살고 있는 도시 밖의 모든 사람들은 박물관을 방문할 수 있습니다(보호)
그리고 우리는 다음과 같은 방법으로 그것들을 함께 묶을 수 있습니다.
도시 내부의 모든 사람(내부의)과 부모가 살고 있는 도시 외부의 모든 사람(내부의 보호)은 박물관을 방문할 수 있습니다.
프로그래밍 월드:
내부:이 필드는 어셈블리(프로젝트)의 모든 위치에서 사용할 수 있습니다.그것은 그렇다고 말하는 것과 같습니다.public
프로젝트 범위(단, 해당 클래스에서 상속되는 어셈블리 외부의 클래스에서도 프로젝트 범위 외부에 액세스할 수 없음).해당 유형의 모든 인스턴스는 해당 어셈블리(프로젝트 범위)에서 해당 유형을 볼 수 있습니다.
protected: 단순히 파생된 모든 클래스가 이 클래스를 볼 수 있음을 의미합니다(어셈블리 외부 또는 외부).예를 들어 파생 클래스는 다음을 사용하여 메서드 및 생성자 내부의 필드 또는 메서드를 볼 수 있습니다.base.NameOfProtectedInternal
.
따라서 이 두 가지 액세스 한정자()를 함께 protected internal
사용하면 프로젝트 내에서 공개될 수 있고 범위 내에서 해당 클래스에서 상속된 사용자가 볼 수 있습니다.
그들은 다음에 기록될 수 있습니다.
internal protected
그리고 의미를 바꾸지는 않지만, 그것을 쓰는 것은 편리합니다.protected internal
.
보호된 구성원
클래스의 보호 구성원은 포함된 클래스(선언된 클래스)와 어셈블리 내 및 어셈블리 외부의 파생 클래스에서만 사용할 수 있습니다.
어셈블리 외부에 있는 클래스가 상속된 클래스에서만 다른 어셈블리의 보호된 멤버를 사용할 수 있는지 여부를 의미합니다.
상속된 클래스에 의해 보호 구성원을 어셈블리 외부에 노출하고 파생된 클래스에서만 사용할 수 있습니다.
참고: 파생 클래스의 개체를 사용하여 보호된 구성원에 액세스할 수 없습니다.
내부 구성원
클래스의 내부 구성원을 사용할 수 있거나 어셈블리 내에서 개체를 만들거나 파생 클래스에서 액세스할 수 있습니다. 또는 어셈블리 내의 모든 클래스에서 액세스할 수 있다고 말할 수 있습니다.
참고: 객체 작성 또는 파생 클래스를 사용하여 어셈블리 외부에서 내부 멤버에 액세스할 수 없습니다.
보호된 내부
보호된 내부 액세스 한정자는 보호됨 또는 내부입니다.
Protected Internal Member는 개체를 생성한다고 선언한 전체 어셈블리 내에서 또는 해당 클래스를 상속받아 사용할 수 있습니다.파생 클래스에서만 어셈블리 외부에서 액세스할 수 있습니다.
참고: 보호된 내부 구성원은 동일한 어셈블리 내에서 내부로 작동하고 어셈블리 외부에서는 보호된 상태로 작동합니다.
public - public으로 선언된 멤버(Functions & Variables)는 어디서나 액세스할 수 있습니다.
개인 - 클래스 외부에서 개인 구성원에 액세스할 수 없습니다.구성원에 대한 기본 액세스 지정자입니다. 즉, 구성원(변수 또는 함수)에 대한 액세스 지정자를 지정하지 않으면 비공개로 간주됩니다.따라서 문자열 PhoneNumber;는 개인 문자열 PhoneNumber와 동일합니다.
보호됨 - 보호된 구성원은 하위 클래스에서만 액세스할 수 있습니다.
internal - 동일한 어셈블리 내에서만 액세스할 수 있습니다.
protected internal - 파생 클래스뿐만 아니라 동일한 어셈블리 내에서도 액세스할 수 있습니다.
멤버 또는 유형을 다른 어셈블리의 파생 클래스에서 동시에 사용하려는 경우 보호된 내부 베스트 스위트는 선언된 클래스에서 파생되지 않고 상위 어셈블리의 멤버 또는 유형을 사용하려고 합니다.또한 다른 클래스에서 파생되지 않고 멤버 또는 유형만 사용하려는 경우 동일한 어셈블리에서 내부만 사용할 수 있습니다.
이 설명이 도움이 될 수 있습니다.
Internal Member
Internal
의 멤버class
사용할 수 있거나 액세스할 수 있습니다.assembly
개체를 만들거나 파생된 개체에서class
아니면 당신은 그것이 모든 곳에서 접근 가능하다고 말할 수 있습니다.classes
의 내부에assembly
.
Protected Member
Protected
의 멤버class
포함되어 있는 경우에만 이용 가능한class
(그것이 선언된 곳에서) 그리고 파생된 곳에서.class
의 내부에assembly
그리고 또한 외부.assembly
.
Protected Internal
Protected Internal
액세스 한정자가 조합되었습니다.Protected
또는Internal
.
Protected Internal
전체에서 구성원을 사용할 수 있습니다.assembly
생성을 선언한 곳에서object
또는 그것을 물려받습니다.class
외부에서 액세스할 수 있습니다.assembly
파생된class
오직.
언급URL : https://stackoverflow.com/questions/585859/what-is-the-difference-between-protected-and-protected-internal
'programing' 카테고리의 다른 글
사용자 경고: lzma 모듈을 가져올 수 없습니다.설치된 Python이 불완전합니다. (0) | 2023.05.22 |
---|---|
이클립스: 메이븐 검색 종속성이 작동하지 않습니다. (0) | 2023.05.22 |
Bash에서 문자열을 비교하는 방법 (0) | 2023.05.22 |
npm을 사용하여 모듈을 글로벌하게 설치하려면 어떻게 해야 합니까? (0) | 2023.05.22 |
PyCharm으로 Pylint를 실행하는 방법 (0) | 2023.05.22 |