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

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

12
задан Jason 13 July 2010 в 02:27
поделиться

5 ответов

Если вы говорите об общих ограничениях, да:

class SomeContainer<T> where T : new() {
    ...
}

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

Лучшее, что вы можете сделать, - это использовать отражение в базовом конструкторе, чтобы генерировать исключение (во время выполнения), например:

abstract class MyBase {
    protected MyBase() {
        if (GetType().GetConstructor(Type.EmptyTypes) == null)
            throw new InvalidProgramException();
    }
}

Если вы говорите об одном классе, да; просто вставьте один.

16
ответ дан 2 December 2019 в 18:17
поделиться

Все зависит от того, что вы имеете в виду.

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

public void DoSomething<T>() where T : new() { }
1
ответ дан 2 December 2019 в 18:17
поделиться

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

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

.
0
ответ дан 2 December 2019 в 18:17
поделиться

Как упоминалось в официальной документации MSDN, компилятор C # автоматически генерирует конструктор без параметров, который инициализирует все переменные-члены значениями по умолчанию. Если вы хотите применить свою собственную реализацию, вы можете просто сделать это:

class BaseClass { BaseClass () {// Реализация конструктора без параметров} }

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

Ссылки

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

1
ответ дан 2 December 2019 в 18:17
поделиться

Generics может обеспечить это, но мы не всегда используем generics ;p

Если вы используете модульные тесты, вы можете использовать отражение, чтобы найти все типы, которые соответствуют шаблону, который вы хотите, чтобы иметь конструкторы без параметров (например, все производные от MyBaseObject, или все в Foo. Bar), и проверьте этот способ (путем нахождения конструктора без параметров).

Если вы хотите утверждать это и во время выполнения (возможно, в #DEBUG), такие вещи, как статические конструкторы, могут быть полезными точками для введения дополнительных проверок типов.

2
ответ дан 2 December 2019 в 18:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: