Я видел других разработчиков, использующих статические классы как пространства имен
public static class CategoryA
{
public class Item1
{
public void DoSomething() { }
}
public class Item2
{
public void DoSomething() { }
}
}
public static class CategoryB
{
public class Item3
{
public void DoSomething() { }
}
public class Item4
{
public void DoSomething() { }
}
}
Для создания экземпляров внутренних классов это будет выглядеть следующим образом
CategoryA.Item1 item = new CategoryA.Item1();
Смысл в том, что пространства имен могут быть скрыты с помощью ключевого слова «using». Но используя статические классы, необходимо указывать имена классов внешнего уровня, что эффективно сохраняет пространства имен.
Microsoft рекомендует против этого в руководящих принципах . Я лично думаю, что это влияет на читабельность. о чем ты думаешь?
c#
c++
object-oriented
static-typing
namespace
user394128
источник
источник
Ответы:
Использование статических классов в качестве пространств имен не соответствует цели использования пространств имен.
Ключевое отличие здесь:
Если вы определяете
CategoryA
,CategoryB<
как пространства имен, и когда приложение использует два пространства имен:Здесь, если
CategoryA
илиCategoryB
является статическим классом, а не пространством имен, использование для приложения почти такое же, как описано выше.Однако, если вы определите его как пространство имен и приложение использует только 1 пространство имен (не включает в себя
CategoryB
), в этом случае приложение может фактически использовать следующееНо если бы вы определили
CategoryA
как статический класс, вышеприведенное не определено! Каждый вынужден писатьCategoryA.something
каждый раз.Пространства имен должны использоваться, чтобы избежать конфликтов имен, тогда как иерархия классов должна использоваться, когда группировка классов имеет некоторое отношение к модели системы.
источник
using Item1 = CategoryA.Item1
(я думаю, что это работает для вложенных классов, как и для пространств имен)var s = new HideMe.MyPhoneNumberIs12345678.TheRealUsefulClass()
Все, что здесь происходит, определенно не является идиоматическим кодом C #.
Может быть, эти другие пытаются реализовать шаблон модуля - это позволит вам иметь функции, действия и так далее, а также классы в «пространстве имен» (то есть статический класс в данном случае)?
источник
Прежде всего, каждый класс должен находиться в пространстве имен, поэтому ваш пример будет выглядеть так:
Тем не менее, я не вижу никакой пользы от такого рода гимнастики кода, когда вы можете точно так же определить такое пространство имен:
Если вы когда-нибудь задумываетесь о хранении некоторых статических методов на уровне высшего класса, это может иметь смысл, но все же это не то, что имеют в виду создатели C #, а может просто сделать его менее читаемым для других - я бы потратил много времени подумав, ПОЧЕМУ вы это сделали, и подумав, если мне не хватает какого-нибудь исходного файла, который предоставит объяснения
источник
Пространства имен в Java, JavaScript и .NET связаны не полностью и позволяют хранить только классы, но другие вещи, такие как константы или глобальные методы, этого не делают.
Многие разработчики используют уловки «статические классы» или «статические методы», даже если некоторые люди не рекомендуют.
источник
Я знаю, что это старый вопрос, но одна очень веская причина использовать класс в качестве пространства имен (в то время нестатического) состоит в том, что C # не поддерживает определение параметрических или общих пространств имен. Я написал сообщение в блоге на эту тему здесь: http://tyreejackson.com/generics-net-part5-generic-namespaces/ .
Суть этого в том, что при использовании обобщенных элементов для абстрагирования огромных участков стандартного кода иногда необходимо совместно использовать несколько общих параметров между связанными классами и интерфейсами. Обычный способ сделать это - переопределить общие параметры, ограничения и все в каждом интерфейсе и сигнатуре класса. Со временем это может привести к распространению параметров и ограничений, не говоря уже о необходимости постоянно квалифицировать связанные типы, перенаправляя параметры типа из одного типа в аргументы типа связанного типа.
Использование внешнего класса Generic и вложение связанных типов в него может сильно высушить код и упростить его абстракцию. Затем можно получить класс параметрического пространства имен с конкретной реализацией, которая предоставляет все конкретные детали.
Вот тривиальный пример:
Используется так:
Потребляйте производные, как это:
Преимущество написания типов таким способом заключается в дополнительной безопасности типов и меньшем приведении типов к абстрактным классам. Это эквивалент
ArrayList
противList<T>
в большем масштабе.источник