Как определить, является ли инициализатор объекта тем, который вызывает метод Add?

У меня есть обычай Vector Класс, который можно инициализировать несколькими способами. Он имеет следующий конструктор для создания вектора заданной длины со всеми нулями.

public Vector(int length) { ... }

или он может использовать инициализатор объекта путем реализации IEnumerable и Add(..) такой метод, чтобы заполнить данный вектор

var v1 = new Vector{ 1, 2, 5 };

Проблема заключается в том, что вы можете написать следующий код

var v1 = new Vector(3){ 1, 2, 5 };

это выглядит достаточно невинно, но в итоге получается вектор длины 6, где первые три значения равны 0, а затем следующие 3 равны 1,2,5. В идеале это будет возвращать только вектор длины 3 со значениями 1,2,5. Я прошел и прошел инициализацию объекта этого, и, кажется, нет никаких признаков того, что объект создается. Похоже, что конструктор работает, а затем 3 Add() методы называются. Как я могу сказать, что это инициализатор объекта, вызывающий Add() метод и защитить метод от создания дополнительных значений?

ps Как видно в разделе комментариев, API для этого класса не так хорош, как он стоит в вопросе. Работа еще не завершена, но я благодарен за комментарии, поскольку они помогли мне раскрыть мои идеи немного дальше. Я оставляю вопрос как есть, поэтому комментарии имеют смысл.

2 ответа

Решение

Это похоже на проблему дизайна. Вместо того, чтобы ходить и пытаться сказать, что компилятор будет вызывать ваш Add метод, я бы изменил Vector конструктор для перегрузки, принимающий фактические значения, или их массив:

public Vector(double x, double y, double z)

Или же

public Vector(params double[] values)

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

Как я могу сказать, что это объектный инициализатор, вызывающий метод Add() и защищающий метод от создания дополнительных значений?

Вы не Код функционально идентичен:

var v1 = new Vector(3);
v1.Add(1);
v1.Add(2);
v1.Add(3);

Что касается вашего класса, два использования неразличимы.

Вы можете убедиться, что любой, кто пишет , имеет функцию, как вам кажется, и код инициализатора коллекции будет делать то же самое.

Другие вопросы по тегам