Конструкторы без параметров - PullRequest
12 голосов
/ 13 июля 2010

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

Ответы [ 5 ]

16 голосов
/ 13 июля 2010

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

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

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

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

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

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

2 голосов
/ 13 июля 2010

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

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

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

1 голос
/ 13 июля 2010

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

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

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

Ссылки

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

1 голос
/ 13 июля 2010

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

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

public void DoSomething<T>() where T : new() { }
0 голосов
/ 13 июля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...