C # /. NET의 네임 스페이스 전용 클래스 가시성?


87

C #에서 다른 어셈블리에 있지 않고 자체 네임 스페이스 내에서만 클래스를 표시 할 수 있습니까? 이것은 다른 곳에서 사용해서는 안되는 전형적인 도우미 클래스에 유용합니다. (즉, Java가 패키지 개인 클래스라고 부르는 것)


나는 당신의 질문을 이해하지 못합니다. "내부"를 의미하지 않았기 때문에 내 답변을 삭제 했습니까?
Zyphrax

3
@nos : Java의 패키지 수준 가시성에 해당하는 것을 찾고 있습니까?
John Saunders

답변:



80

클래스를 만들 수 internal있지만 이렇게하면 어셈블리 외부의 모든 사용자 가 클래스를 사용할 수 없습니다. 그러나이 작업을 수행하려는 각 네임 스페이스에 대해 별도의 어셈블리 를 만들어야합니다 . 나는 그것이 당신 이 그것을 원하지 않는 이유라고 가정하고 있습니다.

C # 컴파일러를 사용하여 네임 스페이스 가시성 적용

도움이 될 수있는 "가짜 네임 스페이스"의 한 형태로 부분 클래스를 사용하는 방법을 보여주는 문서 ( C #의 네임 스페이스 가시성 )가 있습니다.

저자는 이것이 완벽하게 작동하지 않는다고 지적하고 그는 단점에 대해 논의합니다. 주요 문제는 C # 디자이너가 이러한 방식으로 작동 하지 않도록 C #을 설계 했다는 것입니다. 이는 .NET Framework의 가장 큰 장점 중 하나 인 C # /. NET의 예상 코딩 방식과 크게 다릅니다.

깔끔한 속임수입니다… 이제는 하지 마십시오.


1
방금 예를 찾았습니다.System.Net.Mime.MediaTypeNames.Application
Bitterblue

이 기사에서는 모든 호출에 "네임 스페이스"이름을 접두사로 지정해야하지만 C # 6 "정적 사용"에서는 필요하지 않다고 설명합니다. "네임 스페이스"를 정적 부분 클래스로 만든 다음 클라이언트 코드에서 "정적 사용"을 작성할 수 있습니다.
Pumkko

@Pumkko 클래스는 'using static'문을 사용할 수 있도록 정적 일 필요는 없지만 네임 스페이스로 사용하는 경우 어쨌든 그래야합니다.
Fuzzy Logic

21

내부는 어셈블리 (엄격히 말하면 모듈) 프라이버시입니다. 네임 스페이스 가시성에는 영향을주지 않습니다.

동일한 어셈블리 내의 다른 클래스에서 클래스의 프라이버시를 확보하는 유일한 방법은 클래스가 내부 클래스가되는 것입니다.

이 시점에서 클래스가 비공개 인 경우 해당 클래스 또는 외부 클래스 자체에없는 것은 보이지 않습니다.

보호 된 경우 비공개 일 때 볼 수있는 모든 사람에게 표시되지만 외부 클래스의 하위 클래스에도 표시됩니다.

public class Outer
{
    private class Hidden     { public Hidden() {} }
    protected class Shady    { public Shady() {} }
    public class Promiscuous { public Promiscuous() {} }
}

public class Sub : Outer
{
    public Sub():base() 
    {
        var h = new Hidden();      // illegal, will not compile
        var s = new Shady();       // legal
        var p = new Promiscuous(); // legal
    }
}

public class Outsider 
{
    public Outsider() 
    {
        var h = new Outer.Hidden();      // illegal, will not compile
        var s = new Outer.Shady()        // illegal, will not compile
        var p = new Outer.Promiscuous(); // legal
    }
}

본질적으로 원하는 것을 달성하는 유일한 방법은 외부 클래스를 네임 스페이스의 한 형태로 사용하고 해당 클래스 내에서 제한하는 것입니다.


@ShuggyCoUK : 공개 클래스 Sub : 외부는 봉인되어야합니다 공개 클래스 Sub : Outer ??? +1하지만 ... 그것은 나를 위해 작동
IAbstract

0

단일 어셈블리가있는 경우 해당 어셈블리에 원하는만큼 네임 스페이스를 정의 할 수 있지만 IDE에서 적용하는 수정 자에 관계없이 항상 다른 네임 스페이스의 클래스를 볼 수 있습니다.


0

직접적으로 가능한지 확실하지 않지만 가짜로 만드는 몇 가지 좋은 방법은 다음과 같습니다.

1) 이런 종류의 물건이 필요한 클래스는 도우미 클래스를 내부 클래스로 갖는 단일 클래스에서 상속받습니다.

2) 확장 메서드를 사용한 다음 네임 스페이스 내의 확장 메서드 만 참조하십시오.

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