Частный вложенный статический класс - хорошая или плохая практика?
Будет ли считаться плохой практикой встраивать закрытый статический класс внутри нестатического класса?
public class Outer
{
private static class Inner
{
}
}
Идея здесь в том, что все экземпляры "Outer" будут делиться доступом к статическому состоянию. Другой способ сделать это может состоять в том, чтобы просто позволить классу Inner быть нестатическим и использовать статический экземпляр этого объекта:
public class Outer
{
private static innerInstance = new Inner();
private class Inner
{
}
}
Подобный эффект. Каковы плюсы и минусы или другие соображения с этим подходом?
Я должен признать, что почти никогда использовать вложенные классы, статические или нет, но меня интересует эта конкретная концепция.
Ответы
Ответ 1
Оба подхода полностью действительны.
Желаю, чтобы разработчики чаще использовали частные вложенные классы. В сочетании с ключевым словом С# partial
он делает записи очень сложных классов более удобными для обслуживания. Представьте, что вам нужно создать класс, который имеет сложность небольшого приложения - намного проще, если вы действительно можете создать целое частное приложение, с классами, которые полностью являются внутренними для вашего сложного внешнего класса!
Один очень распространенный случай, который я видел, это перечисления - это может быть довольно сложным, особенно когда вы начинаете создавать пользовательские итераторы, которые могут быть скованы, например LINQ. Скрытие сложности внутри отдельных классов является самым определением инкапсуляции.
Ответ 2
Если класс используется в многопоточном приложении, вам может потребоваться контролировать доступ к статическому состоянию посредством блокировки. Это проблема со статическим состоянием, независимо от того, является ли она вложенным или нет.
Ответ 3
Нет ничего плохого в этом, и почему это должно быть?
Ограничение ограничено, поэтому доступ к нему имеют только экземпляры внешнего класса, и это отличное место для размещения констант и других общих функций, которые являются частными для функциональности внешнего класса, без необходимости создавать его все время.
Я не вижу в этом ничего, кроме хорошей практики.
Ответ 4
Это зависит от того, что делает класс Inner
. Если это просто статический внутренний класс утилиты, это путь.
public class Calculator
{
private static class HexToDecUtils
{
// converter code here
}
}
В противном случае, если класс Inner
является составным с другим объектом, он не должен быть статическим классом.
public class Car
{
private class Engine
{
// your code here
}
}
Ответ 5
В этом нет ничего плохого, хотя если вы хотите, чтобы вложенный статический класс помогал упорядочивать статическое состояние или методы, это может быть предупреждающим знаком о том, что класс становится слишком большим. Вложенные частные классы имеют много применений (внутренние структуры данных, частные реализации переданных частных интерфейсов и т.д.), Но статический частный класс - это просто способ объединить вещи.