В С# существует ли способ обеспечить, чтобы класс ДОЛЖЕН иметь конструктор без параметров?
Конструкторы без параметров
Ответ 1
Если вы говорите об общих ограничениях, да:
class SomeContainer<T> where T : new() {
...
}
Если вы говорите о наследовании. Невозможно потребовать, чтобы каждый класс, который реализует ваш интерфейс или наследует ваш базовый класс, имеет конструктор без параметров.
Лучшее, что вы можете сделать, это использовать отражение в вашем базовом конструкторе для исключения исключения (во время выполнения), например:
abstract class MyBase {
protected MyBase() {
if (GetType().GetConstructor(Type.EmptyTypes) == null)
throw new InvalidProgramException();
}
}
Если вы говорите об одном классе, да; просто введите один.
Ответ 2
Generics может обеспечить это, но мы не всегда используем generics, p
Если вы используете модульные тесты, вы можете использовать отражение, чтобы найти все типы, которые соответствуют шаблону, который вы хотите иметь безпараметрические конструкторы (например, все, полученное из MyBaseObject
, или все в пространстве имен Foo.Bar
), и проверим этот способ (найдя конструктор без параметров).
Если вы хотите утверждать это и во время выполнения (возможно, в #DEBUG
), такие вещи, как статические конструкторы, могут быть полезными точками для ввода дополнительных проверок типа.
Ответ 3
Это зависит от того, что вы имеете в виду.
Например, вы можете ограничить общий тип параметра в классе или методе, чтобы иметь конструктор без параметров с ключевым словом new
, но нет реального метода ограничения фактического определения класса, выходящего за рамки этого.
public void DoSomething<T>() where T : new() { }
Ответ 4
Как упоминалось в официальной документации MSDN, компилятор С# автоматически генерирует конструктор без параметров, который инициализирует все переменные-члены до значений по умолчанию. Если вы хотите применить свою собственную реализацию, вы можете просто сделать это:
класс BaseClass { BaseClass() {//Внедрение безпараметрического конструктора} }
Если вы имеете в виду общие ограничения, обратитесь к сообщению SLaks.
Ссылки
Ответ 5
Я столкнулся с такой проблемой несколько раз, я думаю, что существует требование для абстрактных/интерфейсных конструкторов. Проблема заключается в том, что вы используете Activator.CreateInstance
или какой-либо другой метод для создания типа, который вы не можете реализовать (довольно распространенный IoC). Жизнь была бы намного проще, если бы вы могли заставить разработчика реализовать конструктор с правильными параметрами - даже если целью является просто передать параметры базовому конструктору.
Ограничение new()
немного помогло проблеме с момента выпуска версии 2.0, но она все еще не решает проблему при использовании не используемых дженериков, или если вам нужны конкретные аргументы (и вы не хотите общаться с awkward ConstructorInfo, который не может быть проверен статически.)