Частный вложенный статический класс - хорошая или плохая практика?

Будет ли считаться плохой практикой встраивать закрытый статический класс внутри нестатического класса?

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

В этом нет ничего плохого, хотя если вы хотите, чтобы вложенный статический класс помогал упорядочивать статическое состояние или методы, это может быть предупреждающим знаком о том, что класс становится слишком большим. Вложенные частные классы имеют много применений (внутренние структуры данных, частные реализации переданных частных интерфейсов и т.д.), Но статический частный класс - это просто способ объединить вещи.