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.