Подтвердить что ты не робот

Прозрачность видимости только пространства имен в С#/. NET?

В С# вы можете сделать класс видимым только внутри собственного пространства имен, не проживая в другой сборке? Это кажется полезным для обычных классов-помощников, которые не должны использоваться в других местах. (то есть, что java вызывает частные классы пакетов)

4b9b3361

Ответ 1

Я не думаю, что то, что вы хотите, возможно.

Ответ 2

Вы можете создавать классы internal, но это не позволяет кому-либо, кроме сборки, использовать класс. Но вы все равно должны сделать отдельную сборку для каждого пространства имен, с которым вы хотите это сделать. Я предполагаю, что именно поэтому вы не хотели бы этого делать.

Получение компилятора С# для обеспечения видимости пространства имен

Здесь есть статья (видимость пространства имен в С#), которая показывает метод использования частичных классов как формы "поддельного пространства имен", который вам может быть полезно.

Автор указывает, что это не работает отлично, и он обсуждает недостатки. Основная проблема заключается в том, что разработчики С# , разработанные С#, не работают таким образом. Это сильно отличается от ожидаемых методов кодирования в С#/. NET, что является одним из основных преимуществ .NET Framework.

Это аккуратный трюк & hellip; теперь не делают этого.

Ответ 3

internal - это сборка (строго говоря, модуль). Это не влияет на видимость пространства имен.

Единственный способ добиться конфиденциальности класса из других классов внутри одной и той же сборки - это класс, который будет внутренним классом.

В этот момент, если класс является закрытым, он невидим для чего-либо, кроме этого класса или самого внешнего класса.

Если защита защищена, она видна всем, кто может видеть ее, когда она является частной, но также видима для подклассов внешнего класса.

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

По сути, единственный способ добиться желаемого - использовать внешний класс как форму пространства имен и ограничиться внутри этого класса.

Ответ 4

Если у вас есть одна сборка, вы можете определить столько пространств имен в этой сборке, сколько хотите, но независимо от того, какой модификатор вы применяете в среде IDE, вы всегда сможете видеть классы в других пространствах имен.

Ответ 5

Не уверен, что это возможно, но несколько хороших способов подделать:

1) Пусть классы, которым этот тип материала наследуется от одного класса, который имеет вспомогательный класс как внутренний класс.

2) Используйте методы расширения, а затем ссылайтесь только на методы расширения в пространстве имен.