Закрытый вложенный статический класс - хорошая или плохая практика? - PullRequest
14 голосов
/ 10 ноября 2011

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

public class Outer
{
    private static class Inner
    {


    }
}

Идея в том, что все экземпляры 'Outer' будут иметь доступ к статическому состоянию. Другим способом сделать это может быть просто позволить классу Inner быть нестатичным и использовать его статический экземпляр:

public class Outer
{
    private static innerInstance = new Inner(); 

    private class Inner
    {


    }
}

Аналогичный эффект. Каковы плюсы / минусы или другие соображения с этим подходом?

Я должен признать, что я почти никогда не использую вложенные классы, статические или нет, но меня интересует эта конкретная концепция ..

Ответы [ 5 ]

18 голосов
/ 10 ноября 2011

Оба подхода полностью допустимы.

Я бы хотел, чтобы разработчики чаще использовали частные вложенные классы.В сочетании с ключевым словом c # s partial это делает написание очень сложных классов гораздо более удобными в обслуживании.Представьте, что вам нужно создать класс, который имеет сложность для небольшого приложения - гораздо проще, когда вы на самом деле можете создать целое частное приложение с классами, полностью внутренними для вашего сложного внешнего класса!

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

3 голосов
/ 10 ноября 2011

Если класс используется в многопоточном приложении, вам может потребоваться контролировать доступ к статическому состоянию с помощью блокировки.Это проблема со статическим состоянием, независимо от того, является ли оно частным или нет.

1 голос
/ 10 ноября 2011

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

1 голос
/ 10 ноября 2011

В этом нет ничего плохого, и почему это должно быть?

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

Я не вижу в этом ничего, кроме хорошей практики.

0 голосов
/ 10 ноября 2011

Это зависит от того, что делает Inner класс. Если это просто служебный класс, статический внутренний класс - это путь.

public class Calculator
{
    private static class HexToDecUtils
    {
        // converter code here
    }
}

Другими словами, если класс Inner является составным с другим объектом, он не должен быть статическим классом.

public class Car
{
    private class Engine
    {
        // your code here
    }
}
...