Pull to refresh

Comments 32

UFO landed and left these words here
UFO landed and left these words here

В статье стоит упомянуть, что индексы ввели одновременно с диапазонами, а там ^0 может использоваться и имеет довольно логичное значение.

В c++ аналогом будет итератор, возвращаемый методом end.

UFO landed and left these words here

А индексацию булевыми значениями array[array > 0] можно делать ?

Заодно и стринговыми, потому что почему бы и нет, да?

Можно забыть отнять единицу и получить ошибку во время выполнения работы. Поверьте, начинающие программисты очень часто забывают про это.

Как можно забыть, если ты по идее, должен array.len-1 сохранить в отдельном переменной, если array.len не меняется

Поверьте. Начинающие программисты часто забывают про это.

абсолютно ненужная свистоперделка, жаль что таки включили....

То есть от начала мы считаем с 0, а от конца с 1. Читаемость кода теми, кто не использует эту фичу постоянно очень усложняется

Я тоже разочарован этим фактом. Была какая-то причина так делать?

Логика в этом есть- беря первый элемент от начала мы "пропускаем" 0 элементов, и читаем один. Беря первый от конца, мы должны сначала "пропустить" один, а потом его считать. Но для человека такая логика не сразу интуитивна

UFO landed and left these words here

Мне кажется, лучше всего сделано в D - там используется контекстный символ $, означающий размер индексируемого массива. В результате получается

int arr[] = {1,2,3,4,5};
int x = arr[0];   // 1
int y = arr[$-1]; // 5

т.е. да, мы видим что последний элемент имеет индекс "$-1" (т.е. понятно откуда в C#8 растут ноги индексации с единицы). Запись на 1 символ больше чем в C#8, зато никаких специальных типов, можно по прежнему использовать обычные целые числа.

А вот идея индексации с конца отрицательными числами, как делается в некоторых языках - не самая лучшая. Индекс может оказаться отрицательным случайно, по ошибке.

Но и за контекст не вытащить. А в шарпе это System.Index может быть параметром функции, например.

А можно написать, например, так: arr[$ / 2]?

Следует помнить, что индексация начинается с нуля…

Можно забыть отнять единицу и получить ошибку во время выполнения работы. Поверьте, начинающие программисты очень часто забывают про это.

Теперь появился универсальный, удобный и логически понятный способ получения последнего элемента массива.

…важно помнить, что для индексов с отсчетом от конца массива счет начинается с 1 (а не с 0, как в обычном случае).

{
// логика
}

Простите, не удержался :)

// Получаем длину массива
var length = numbers.Length;
// Получаем последний элемент
var lastNumber = numbers[length - 1];

Какие есть в  этом коде минусы:

1. Можно забыть отнять единицу и получить ошибку во время выполнения работы.

2. Код становится менее читаемым

Не согласен с обоими пунктами. Первое: с таким же успехом можно забыть и все остальное - даже то, как создать новый проект в VS. Второе: читаемость отличная; этот код можно дословно перевести на русский язык и его поймет половина НЕпрограммистов.

А вот что забыл сам автор, так это проверку length на 0.

Все таки наше общество программистов ещё не доросли до общества западных программистов.

Нам бы лишь бы найти за что упрекнуть. Откуда это все идёт не понимаю

Не думайте, что западные программисты в своих сообществах только и делают, что обмазывают друг друга восхвалениями. Дискуссии на фоне несогласий у них случаются не менее пылкие, знаете ли. Безусловно, я мог бы формулировать свои мысли более деликатно (в стиле "да, но" или как-то подобно тому), но, к своему стыду, не посчитал, что отказ от этого принесет кому-либо душевных травм. Вполне возможно, представители "сообщества западных программистов" более склонны не задеть чувства окружающих, но, скорее того, отличия между "ими" и "нами" в другом: воспринимать критику как акт агрессии - это да, это наше, родное.

Напрягает лишь, что есть возможность хранить индекс объектом, и что возможность в [] указывать new Index() позволяет и поощрает создавать отдельный объект для обращения к элементу по индексу, а создавать лишние объекты - не есть хорошо. Но если данная фича также имеет поддержку compile-time развертки a[^N] в a[a.lenght - N], то вопросов меньше

Индекс - это структура, так что аллокаций нет.

Плюс, действительно, compile-time разверта есть, и более того, она работает для array-like типов которые имеют индексер и свойство Length или Count. То есть еще один duck typing. Странно, что это не отраженно в статье. Потому что, например, List<> не имеет индексер с типом Index.

Лично мне нравится, что появилась такая функция (индексы). Пригодится.

Sign up to leave a comment.

Articles