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

Конструкторы без параметров

В С# существует ли способ обеспечить, чтобы класс ДОЛЖЕН иметь конструктор без параметров?

4b9b3361

Ответ 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.

Ссылки

http://msdn.microsoft.com/en-us/library/ace5hbzh.aspx

Ответ 5

Я столкнулся с такой проблемой несколько раз, я думаю, что существует требование для абстрактных/интерфейсных конструкторов. Проблема заключается в том, что вы используете Activator.CreateInstance или какой-либо другой метод для создания типа, который вы не можете реализовать (довольно распространенный IoC). Жизнь была бы намного проще, если бы вы могли заставить разработчика реализовать конструктор с правильными параметрами - даже если целью является просто передать параметры базовому конструктору.

Ограничение new() немного помогло проблеме с момента выпуска версии 2.0, но она все еще не решает проблему при использовании не используемых дженериков, или если вам нужны конкретные аргументы (и вы не хотите общаться с awkward ConstructorInfo, который не может быть проверен статически.)