2010-12-30 3 views
0

나는 C#에서 ClassLibrary 프로젝트를 가지고 있고 다른 네임 스페이스 아래에있는 모든 'private classes'는 같은 어셈블리 (프로젝트) 안에서 서로 접근 할 수있다.내 C# Private 클래스는 DLL 내부 어디에서나 액세스 할 수 있습니다. 그런 다음 내부 DLL은 무엇입니까?

Class1.cs 
---------------------------- 
namespace MyClass1App 
{ 
    private class Class1{} 
} 


Class2.cs 
---------------------------- 
namespace MyClass2App 
{ 
    private class Class2{} 
} 

이제 클래스 1은()에 액세스하고 Class2의 인스턴스를 만들 수 있습니다() 클래스 [같은 ... 새로운 MyClass2App.Class2()]. 예, 이러한 클래스 (Class1() 및 Class2())는 어셈블리 외부에서 액세스 할 수 없습니다. 이 클래스가 'Internal'로 만들어지면 같은 동작을합니다. 누군가가 클래스 레벨에 적용될 때 '개인'및 '내부'액세스 지정자의 실제 사용/차이점을 이해하는 데 도움을 줄 수 있습니까?

감사합니다.

+0

간단한 샘플뿐만 아니라 정확한 코드를 게시 할 수 있습니까? – sagie

+1

이 코드는 컴파일하지 않아야합니다. 그것은 확실히 나를위한 것이 아닙니다. – devuxer

답변

3

alt text

일반 수업의 경우 publicinternal 만 적용 할 수 있습니다. 다른 액세스 한정자는 의미가 없습니다.

중첩 된 클래스는 모든 액세스 수정 자 유형을 가질 수 있습니다.

+1

위에서 언급 한 액세스 한정자 테이블을 무시합니다. 클래스 멤버에 대해서만 말하고 실제로는 클래스 수준에 대해서는 말하지 않기 때문입니다. 그러나 귀하의 한 라이너 회신이 유용하고 신속하게 제 질문에 대답하는 것을 느낍니다. 감사! –

1

Access Modifiers (C# Programming Guide)

클래스 또는 구조체 멤버는 는 액세스의 다섯 가지 유형 중 하나를 선언 할 수 있습니다. 공개 또는 내부, 클래스 및 구조체 등이 될 수 있습니다. 클래스 멤버는 보호 키워드를 사용하여 보호 된 것으로 선언 된 일 수 있습니다. 즉 기본 클래스로 클래스를 사용하는 파생 형식 만 구성원에 액세스 할 수 있습니다. 보호 된 내부 및 내부 키워드를 조합하면 반원이 보호 된 내부 전용으로 표시 될 수 있습니다. 동일한 유형의 어셈블리에서 해당 멤버에 액세스 할 수 있습니다. 마지막으로 클래스 또는 구조체 멤버 개인 키워드로 전용으로 선언 할 수 있습니다 멤버 또는 멤버를 선언하는 클래스 또는 구조체가 멤버에 액세스 할 수 있음을 나타냅니다.

중복 질문 : Internal vs. Private Access Modifiers

+0

클래스/struct 'memebers'의 경우 액세스 지정자는 C# 가이드에서 설명한 것처럼 잘 작동합니다. 그러나 내 질문에 액세스 수정 자 '클래스'수준 적용 및 해당 클래스는 다른 클래스의 구성원이 아닙니다. –

+0

다른 네임 스페이스가있는 한 왜 다른 동작을 경험해야하는지 알 수는 없습니다. –

+0

"네임 스페이스 내부의 개인 클래스를 외부 세계에 표시해서는 안됩니다."- 요점은 분명합니다. 것들을 체계적으로 만든다. –

3

당신은 네임 스페이스 수준에서 private 같은 클래스를 선언 할 수 없게한다. 다른 클래스에 포함 된 개인 클래스 만 가질 수 있습니다. 나는이 작업을 수행하려고하면

나는 오류가 발생 :

namespace MyApp 
{ 
    private class Class1 
    { 
    } 
} 

이 오류 메시지입니다 : 네임 스페이스에 정의 된

요소가 명시 적으로 비공개로 선언 보호 될 수 없다, 또는 보호 된 내부

+0

당신 말이 맞았 어! 내 질문에 명확하게하기 위해 코드 예제에서 '비공개'라고 언급했습니다. 'private'키워드를 제거하는 코드를 컴파일 할 수 있습니다. 이 경우 컴파일러는 여전히 class1을 private으로 간주합니다. –

+1

@Pavan, 액세스 수정자를 사용하여 클래스를 선언하면 내부가 아닌 private로 간주됩니다. 네가 말하는 것은 중첩 된 클래스 (기본 액세스 수준이 무엇인지 기억하지 못합니다)에 해당 될 수 있지만 최상위 클래스에는 해당되지 않습니다. – VladV

+0

@Will, 실제로'internal'은 네임 스페이스 레벨에서 선언 된 클래스의 기본값입니다. – devuxer