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

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



답변

나는 당신이 원하는 것이 가능하다고 생각하지 않습니다.


답변

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

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

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

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

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


답변

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

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

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

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

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
    }
}

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


답변

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


답변

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

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

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


답변