2010-04-16 8 views
7

가능한 중복 : 내가 원하는 것은 네임 스페이스를 넣을 필요없이 동일한 네임 스페이스 내의 다른 클래스에만 액세스 할 수있는 클래스를 가지고있다 개인 클래스 내부 네임 스페이스


Namespace only class visibility in C#/.NET ?

그것 자체의 어셈블리.

이것이 C#에서 가능하지 않은 이유가 있습니까?

편집 : 컴파일러에서 private이 허용되지 않는다고 말하면서 조금 질문을 변경했습니다. 아무도이 이유를 말해 줄 수 있습니까?

+0

물어 보지 않은 것이 있습니까? 내가이 질문을 쓸 때 이것을 놓쳤다. 그러나 이것이 왜 그렇게 중요한지에 대한 통찰력이 있습니까? – user318253

+0

hehe ... 사람들이 어떻게 빨리 중복 게시물을 찾았는지 궁금합니다. 오른쪽의 "관련"섹션에도 나와 있지는 않습니다. @ 제임스 : 어떻게합니까? :) – gehho

+0

어쩌면 왜 사람들이 당신에게 대안을 제안 할 수 있다고 말하는지? 그것이 의미하는대로 당신이하고 싶은 것은 성취하기가 불가능합니다. –

답변

2

gehho의 답변 외에도 namespace는 모든 유형이 고유 한 이름을 가질 수있는 유형 이름의 일부일뿐입니다. 따라서 이름 공간 내에서 유형에 대한 액세스를 제한 할 수 없습니다.

+0

그래서 네임 스페이스는 충돌을 피하기 위해 존재하며 폴더와 같은 방식으로 그룹화하지는 않습니다. 네임 스페이스는 유형을 포함하는 컨텍스트 만 제공합니다. – user318253

+0

@blacklion : 네임 스페이스를 한 유형의 고유 식별자로 생각하십시오. 예를 들어, 같은 이름의 2 개의 클래스를 가질 수 있습니다. 'System.DateTime'은'MyNamespace.DateTime'과 다릅니다. – James

+0

감사합니다. 자바 패키지를 생각하고있었습니다. – user318253

5

이것은 불가능합니다.

internal 수정자를 사용하는 클래스가 포함 된 어셈블리에 대한 액세스 만 제한 할 수 있습니다.

또한 클래스를 중첩 된 클래스로 지정하여 클래스에 대한 액세스를 클래스으로 제한 할 수 있습니다. 예 : 클래스 B를 클래스 A의 개인 중첩 클래스로 만들면 B는 A로만 액세스 할 수 있습니다.

이 두 옵션이 최선이라고 생각합니다. 네임 스페이스에 대한 액세스를 정말로 제한하려면 별도의 어셈블리에 넣어야합니다.

편집 : 두 번째 질문 : 개인 수업이 허용되지 않는 이유는 무엇입니까? 개인 클래스는 다른 클래스 내에 중첩 된 경우에만 허용됩니다. 비 중첩 클래스를 비공개로 만들면 그 용도는 무엇입니까? 어쨌든 액세스 할 수 없으므로 아무 것도 할 수 없습니다.

+0

C#에서는 이것이 가능하지 않은 이유가 있습니까? 제작자는 왜 이것을 허용하지 않습니까? – user318253

+0

여기에서 질문하는 것이 정말 어렵습니다. 나는 그것을 너무 조심스럽게 말해야한다. 예를 들어 비공개가 클래스 내의 유형에 허용되고 클래스 내의 모든 것이 액세스 할 수 있습니다. 개인은 모든 유형의 액세스를 제한하지 않습니다 – user318253

+0

귀하의 의견을 이해할 수 없습니다. 이 질문입니까? 그렇다면 다시 말해 주거나 더 자세한 정보를 제공하십시오. 아니면 내 대답이 잘못됐다고 생각하니? – gehho

2

internal 클래스를 사용하여 현재 어셈블리에 대한 표시 여부를 제한 할 수 있습니다.

그러나 InternalsVisibleTo 특성을 사용하여 다른 어셈블리에서 어셈블리를 볼 수있게 할 수 있습니다.

조립 AssemblyOne에 MyInternalClass를 정의

[assembly: InternalsVisibleTo("AssemblyTwo")] 

internal class MyClass { 
    internal void DoSomeAction() { } 
} 

그런 다음 AssemblyTwo 다른 클래스를 정의 :

public class MyOtherClass 
{ 
    public void DoAnotherAction() 
    { 
     MyClass c = new MyClass(); 
     c.DoSomeAction(); 
    } 
} 
+0

고마워요. 제 질문이 아니 었습니다. – user318253

+0

@blacklion : 예, 네임 스페이스의 가시성을 제한하지 않습니다. 나는 당신의 질문을 오해했습니다. –

0

당신이 어떤 다른 외부 어셈블리 네임 스페이스 유형을 추가 할 수 있기 때문에 . 동일한 네임 스페이스에 있지만 다른 어셈블리는 "개인 유형"을 참조합니까?

아니요, 우리는 이해하기 어려운 행동이 있습니다 (네임 스페이스의 한 유형은 유형을 볼 수 있고 다른 것은 네 아니오 - 아니오). 예인 경우, 다른 어셈블리의 유형은 어셈블리의 "개인"세부 사항에 액세스 할 수 있기 때문에 "개인"의 정의와 모순됩니다.

+0

Thibault 참조 Falise 내부 답변에 대한 답변 가능 – user318253

0

임의의 네임 스페이스를 선언 할 수 있으므로 자신의 클래스를 System 네임 스페이스의 일부로 선언 할 수 있습니다. 물론 Microsoft가 네임 스페이스에 같은 이름의 클래스를 추가하기로 결정하면 오류가 발생합니다.

왜 "네임 스페이스 표시"를 원하십니까? 그것은 특별한 종류의 대중을 의미 할 것입니다. 왜냐하면 누구나 클래스가 필수 네임 스페이스에 속해 있다고 선언하여 클래스에 액세스 할 수 있기 때문입니다.

보안 기능으로 원하면이 기능을 사용할 수 없습니다. "내부"클래스를 숨겨서 네임 스페이스를 제거하려는 경우 예를 들어 메인 네임 스페이스 아래에 내부 네임 스페이스를 가질 수 있습니다.

관련 문제