Как стать автором
Обновить

Комментарии 32

НЛО прилетело и опубликовало эту надпись здесь

Скоро выйдет статья про срезы

НЛО прилетело и опубликовало эту надпись здесь

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

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

НЛО прилетело и опубликовало эту надпись здесь

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

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

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

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

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

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

Есть и плюсы и минусы.

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

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

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

НЛО прилетело и опубликовало эту надпись здесь

Мне кажется, лучше всего сделано в 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.

а рэнжи то в C# завезли?

var part = myarray[1-4];

Да

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

Где то под капотом: ^number=.length-number

Прикольная штука, спасибо за разъяснение.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории