누군가 C #에서 'protected'및 'protected internal'수정 자의 차이점을 자세히 설명해 주시겠습니까? 그들은 같은 방식으로 행동하는 것 같습니다.
누군가 C #에서 'protected'및 'protected internal'수정 자의 차이점을 자세히 설명해 주시겠습니까? 그들은 같은 방식으로 행동하는 것 같습니다.
답변:
A는 수정은 "보호 된 내부"액세스 노조 모두 "보호"와 "내부"수정의.
에서 MSDN, 액세스 수정 자 (C #을 가이드 프로그래밍) :
보호 :
유형 또는 멤버는 동일한 클래스 또는 구조체의 코드 또는 해당 클래스에서 파생 된 클래스에서만 액세스 할 수 있습니다.
내부 :
유형이나 멤버는 동일한 어셈블리의 코드로 액세스 할 수 있지만 다른 어셈블리에서는 액세스 할 수 없습니다.
내부 보호 :
형식 또는 멤버는 선언 된 어셈블리의 모든 코드 또는 다른 어셈블리의 파생 클래스 내 에서 액세스 할 수 있습니다 . 다른 어셈블리의 액세스는 보호 된 내부 요소가 선언 된 클래스에서 파생 된 클래스 선언 내에서 이루어져야하며 파생 클래스 유형의 인스턴스를 통해 발생해야합니다.
참고 : protected internal
수단 " protected
OR internal
"(동일한 어셈블리의 모든 클래스 또는 파생 된 클래스 - 그것은 다른 어셈블리에있는 경우에도).
... 완전성을 위해 :
비공개 :
유형 또는 멤버는 동일한 클래스 또는 구조체의 코드로만 액세스 할 수 있습니다.
공개 :
형식이나 멤버는 동일한 어셈블리 나 다른 어셈블리를 참조하는 다른 코드로 액세스 할 수 있습니다.
개인 보호 :
액세스는 현재 어셈블리 내의 포함 클래스에서 파생 된 포함 클래스 또는 유형으로 제한됩니다.
( C # 7.2부터 사용 가능 )
protected
모든 어셈블리의 하위 클래스에서 사용할 수 있습니다.
protected internal
즉 protected
, 동일한 어셈블리의 모든 항목에 액세스 할 수 있습니다.
중요한 것은 "동일한 어셈블리의 서브 클래스"를 의미하는 것이 아니라 교차점이 아닌 두 요소의 합집합입니다.
private protected
C # 7.2에 소개 된 액세스 수정자를 사용하여 달성 할 수 있습니다
실제로 방법에 대해 :
protected- 상속 된 클래스에 액세스 가능합니다. 그렇지 않은 경우는 비공개입니다.
internal- 어셈블리 내부의 클래스에 대해서만 공용, 그렇지 않으면 개인용.
protected internal -protected 또는 internal-메서드는 상속 된 클래스 및 어셈블리 내의 모든 클래스에 액세스 할 수 있음을 의미 합니다.
protected
AND 로 표시하는 방법이 internal
있습니까?
protected internal
.
private protected
docs.microsoft.com/en-us/dotnet/csharp/language-reference/...
"보호 된 내부"접근 자의 범위를 이해하는 데 여전히 많은 혼란이 있지만, 대부분 정의가 올바르게 정의되어 있습니다. 이것은 "보호 된"과 "보호 된 내부"의 혼란을 이해하는 데 도움이되었습니다.
공개 는 실제로 어셈블리 내부 및 외부에 공개됩니다 ( 공개 내부 / 공개 외부 )
protected 는 실제로 어셈블리 내부 및 외부에서 보호됩니다 (내부 보호 / 외부 보호 ) (최상위 클래스에서는 허용되지 않음)
private 은 실제로 어셈블리 내부 및 외부에서 비공개입니다 ( private internal / private external ) (최상위 클래스에서는 허용되지 않음)
internal 은 어셈블리 내부에서 실제로 공개이지만 private과 같이 어셈블리 외부에서 제외됩니다 ( 공개 내부 / 제외 외부 )
내부 보호 는 어셈블리 내부에서 실제로 공개되지만 어셈블리 외부에서 보호됩니다 ( 공개 내부 / 외부 보호 ) (최상위 클래스에서는 허용되지 않음)
보시다시피 보호 내부 는 매우 이상한 짐승입니다. 직관적이지 않습니다.
이제 Microsoft가 왜 ( 보호 된 내부 / 제외 된 외부 )를 만들지 않았는지 , 또는 "개인 보호"또는 "내부 보호"라고 생각 하는 이유는 무엇입니까? lol. 불완전한 것 같습니까?
보호, 내부 또는 개인 유형 내에 공용 또는 보호 된 내부 중첩 멤버를 중첩 할 수 있다는 사실이 혼란에 추가됩니다. 외부 어셈블리 액세스를 제외하는 내부 클래스 내부의 중첩 된 "보호 된 내부"에 액세스하는 이유는 무엇입니까?
MS는 이러한 중첩 유형은 상위 유형 범위에 의해 제한되지만 컴파일러가 말하는 것은 아닙니다. 범위를 어셈블리로 제한해야하는 내부 클래스 내부에서 보호 된 내부를 컴파일 할 수 있습니다.
나에게 이것은 불완전한 디자인처럼 느껴집니다. 상속을 명확하게 고려할뿐만 아니라 중첩 형식의 보안 및 계층도 고려하는 시스템에 대한 모든 형식의 범위를 단순화해야합니다. 이로 인해 불완전한 범위 지정 시스템을 기반으로 유형 및 멤버의 액세스 가능성을 발견하는 대신 객체 공유가 매우 직관적이고 세분화되었습니다.
이 용어에 대한 명확한 정의를 읽었습니다.
보호 : 액세스는 클래스 정의 및 클래스에서 상속되는 모든 클래스로 제한됩니다. 유형 또는 멤버는 동일한 클래스 또는 구조체 또는 해당 클래스에서 파생 된 클래스의 코드로만 액세스 할 수 있습니다.
내부 : 액세스는 현재 프로젝트 어셈블리 내에 정의 된 클래스로만 제한됩니다. 유형 또는 멤버는 동일한 클래스의 코드로만 액세스 할 수 있습니다.
내부 보호 : 액세스는 클래스를 포함하는 현재 어셈블리 또는 유형으로 제한됩니다.
보호 회원
포함 된 클래스 (선언 된 클래스)와 어셈블리 내 및 어셈블리 외부의 파생 클래스에서만 사용할 수있는 클래스의 보호 된 멤버입니다.
어셈블리 외부에있는 클래스가 해당 클래스 만 상속하여 다른 어셈블리의 보호 된 멤버를 사용할 수 있는지 여부를 의미합니다.
해당 클래스를 상속하여 보호 된 멤버를 어셈블리 외부에 노출시키고 파생 클래스에서만 사용할 수 있습니다.
참고 : 파생 클래스의 개체를 사용하여 보호 된 멤버에 액세스 할 수 없습니다.
내부 회원
클래스의 내부 멤버는 개체를 만들거나 파생 클래스에서 어셈블리 내에서 사용 가능하거나 액세스 할 수 있거나 어셈블리 내의 모든 클래스에서 액세스 가능하다고 말할 수 있습니다.
참고 : 객체 생성 또는 파생 클래스를 사용하여 어셈블리 외부에서 내부 멤버에 액세스 할 수 없습니다.
내부 보호
보호 된 내부 액세스 수정자는 보호 또는 내부의 조합입니다.
보호 된 내부 구성원은 개체 생성을 선언했거나 해당 클래스를 상속 한 전체 어셈블리 내에서 사용할 수 있습니다. 파생 클래스에서만 어셈블리 외부에서 액세스 할 수 있습니다.
참고 : 내부 보호 멤버는 동일한 어셈블리 내에서 내부로 작동하고 어셈블리 외부에서는 보호로 작동합니다.
public - public으로 선언 된 멤버 (함수 및 변수)는 어디서나 액세스 할 수 있습니다.
개인 -개인 구성원은 수업 외부에서 액세스 할 수 없습니다. 이는 멤버의 기본 액세스 지정자입니다. 즉 멤버 (변수 또는 함수)에 대한 액세스 지정자를 지정하지 않으면 개인용으로 간주됩니다. 따라서 문자열 PhoneNumber; 개인 문자열 PhoneNumber와 같습니다.
protected-보호 된 멤버는 하위 클래스에서만 액세스 할 수 있습니다.
내부 -동일한 어셈블리 내에서만 액세스 할 수 있습니다.
보호 된 내부 -파생 클래스뿐만 아니라 동일한 어셈블리 내에서 액세스 할 수 있습니다.
멤버 또는 형식을 다른 어셈블리의 파생 클래스에서 동시에 사용하려는 경우 보호 된 내부 최상의 제품군은 선언 된 클래스에서 파생되지 않고 부모 어셈블리의 멤버 또는 형식을 사용하려고합니다. 또한 다른 클래스에서 파생되지 않은 멤버 또는 유형 만 사용하려는 경우 동일한 어셈블리에서 내부 만 사용할 수 있습니다.
protected internal
없도록 멤버를 가질 수 있습니까protected
?