Доброе утро! Я пишу класс для рисования гистограмм и, для удобства пользователя, решил добавить несколько удобных конструкторов.
Однако, как только я недавно перешел на контракты кода .NET от DevLabs, я хочу полностью использование предусловий для защиты от собственной (или чьей-либо) глупости.
public HistoGrapher(IList<string> points, IList<T> values)
: this(points.Select((point, pointIndex) => new KeyValuePair<string, T>(point, values[pointIndex])))
{
Contract.Requires<ArgumentNullException>(points != null, "points");
Contract.Requires<ArgumentNullException>(values != null, "values");
Contract.Requires<ArgumentException>(points.Count == values.Count, "The lengths of the lists should be equal.");
}
public HistoGrapher(IEnumerable<KeyValuePair<string, T>> pointValuePairs)
{
// useful code goes here
}
Есть кое-что, что меня смущает. Я не хочу, чтобы первый конструктор когда-либо вызывал второй, если контракт нарушен; однако предполагается, что вызов this (...)
будет выполнен до выполнения тела первого конструктора.
Будет ли этот код работать так, как я хочу? Я еще не пробовал. 0]
Что здесь происходит? Это ошибка, или я неправильно понимаю, как использовать новый массив (3)
?
Так как вопрос состоит в том, почему, это имеет отношение, как JS был разработан.
существует 2 главных причины, о которых я могу думать для объяснения этого поведения:
Производительность: Учитывая x = 10000
и new Array(x)
мудро для конструктора избежать цикличного выполнения от 0 до 10 000 для заполнения массива undefined
значения.
Неявно "неопределенный": Дайте a = [undefined, undefined]
и b = new Array(2)
, a[1]
и b[1]
и возвратится undefined
, но a[8]
и b[8]
также возвратится undefined
, даже если они будут вне диапазона.
В конечном счете, нотация empty x 3
является ярлыком, чтобы не устанавливать и отображать длинный список undefined
значения, которые являются undefined
так или иначе, потому что они не объявляются явно.
Примечание: Учитывая массив a = [0]
и a[9] = 9
, console.log(a)
возвратится (10) [0, empty x 8, 9]
, заполняя разрыв автоматически путем возврата различия между двумя значениями, объявленными явно.