Когда я создаю классы утилиты, я обычно создаю класс, который имеет частный конструктор и предоставляет все его методы и свойства как статические. Какой лучший подход для этого? Какая разница между тем, как я это делаю или создаю статический класс?
Статический класс Vs. Класс с частным конструктором и всеми статическими свойствами и методами?
Ответ 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
Также я собираюсь пойти с частным конструктором, который никогда не вызывается статическими методами. Поэтому любая инициализация там будет потрачена впустую... Но это просто теория.