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

Статический класс Vs. Класс с частным конструктором и всеми статическими свойствами и методами?

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

4b9b3361

Ответ 1

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

Это единственное реальное различие (если в IL нет чего-то особенного)

Итак, если вы используете статический класс, вы избавляете себя от необходимости сделать конструктор закрытым и объявить класс закрытым.

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

Ответ 2

Статический класс никогда не может быть создан. Ни в коем случае, нет.

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

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


Изменить - Уточнение для комментария FosterZ

Скажите, что у вас есть этот класс утилиты:

public class Utility
{
    public static string Config1 { get { return "Fourty Two"; } }

    public static int Negate(int x) { return -x; }

    private Utility() { }      
}

Если другой разработчик не знает о своем намерении, он может сделать это:

public class Utility
{
    public static string Config1 { get { return "Fourty Two"; } }
    public int Config2 { get; set; }

    public static int Negate(int x) { return -x; }

    private Utility() { }

    /// Get an instance of Utility     
    public static Utility GetUtility()
    {
        return new Utility();
    }
}   

Теперь у вас есть класс Франкенштейна. Некоторые из его функций требуют создания экземпляра, а некоторые нет. Возможно, это то, что вы хотите, но, возможно, нет. Вы можете предотвратить это с просмотром кода, но почему бы не сделать ваши намерения явными в коде? Маркировка класса как static устраняет любую возможную путаницу. Вы не можете создавать статический класс или наследовать его.

Ответ 3

В дополнение к предыдущим ответам: компилятор не разрешает нестатические члены в статических классах, а также создает ошибки и ошибки. Это может помочь немного не случайно добавить нестатические элементы.

Ответ 4

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

Ответ 5

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