Информация об изменениях

Сообщение Re[12]: C# 8 - фича №1 от 04.12.2019 18:38

Изменено 04.12.2019 18:42 alexzzzz

Re[12]: C# 8 - фича №1
Здравствуйте, AlexRK, Вы писали:

ARK>>>>>a[^4] — последний элемент с конца

ARK>>>>>a[4] — oops, out of bounds exception, надо a[3]
A>>>>?
ARK>>>Здесь что-то не так?
A>>Я не понял, что значит "последний элемент с конца" и как это связано с ^4.

ARK>Ну, то и значит. Последний элемент с конца это последний элемент, если вести отсчет с конца. Я не знаю, как иначе объяснить.


Последний элемент с конца — это первый элемент (если я правильно понимаю в слова). Если ^4 — первый элемент, значит от конца коллекции до её начала надо сделать 4 шага, значит в ней 4 элемента: 0, 1, 2 и 3.

ARK>Что такое "начало" и "конец"?


Если в чистом виде, то абстракция — на картинке выше нарисованы жирными линиями. Если в практическом плане, то да, скорее адрес. Как и «элемент» — абстрактная сущность, а на практике последовательность байт.

ARK>Если "начало" — это "адрес первого элемента", а конец — это "адрес последнего элемента",


В этом месте проблема.

Начало массива ― адрес первого байта массива, совпадает с адресом первого байта первого элемента. Тут трудностей не возникает.

Конец же массива не может указывать на данные внутри массива. Это не адрес последнего элемента, потому что тогда данные элемента могут лежать за границами массива — глупость получается. Единственный рациональный вариант, который работает для однобайтовых и многобайтовых элементов, считать концом массива адрес первого байта за пределами последнего элемента массива.

Так обычно и принято задавать диапазоны: начало ― адрес/индекс/указатель на первый элемент, конец ― адрес/индекс/указатель на нечто после последнего элемента. Inclusive start, exclusive end.

Ну или второй популярный вариант: адрес/индекс/указатель на начало последовательности и количество элементов. Всю жизнь в NET API использовали второй вариант. Но по сути это одно и то же, переводится друг в друга одной арифметической операцией: start + length = end или end — start = length.

ARK>Только оператор ^ — это не индекс, а какая-то странная сущность.



Обычный унарный оператор, только новый применительно к целым числам.
Re[12]: C# 8 - фича №1
Здравствуйте, AlexRK, Вы писали:

ARK>>>>>a[^4] — последний элемент с конца

ARK>>>>>a[4] — oops, out of bounds exception, надо a[3]
A>>>>?
ARK>>>Здесь что-то не так?
A>>Я не понял, что значит "последний элемент с конца" и как это связано с ^4.

ARK>Ну, то и значит. Последний элемент с конца это последний элемент, если вести отсчет с конца. Я не знаю, как иначе объяснить.


Последний элемент с конца — это первый элемент (если я правильно понимаю в слова). Если ^4 — первый элемент, значит от конца коллекции до её начала надо сделать 4 шага, значит в ней 4 элемента: 0, 1, 2 и 3.

ARK>Что такое "начало" и "конец"?


Если в чистом виде, то абстракция — на картинке выше нарисованы жирными линиями. Если в практическом плане, то да, скорее адрес. Как и «элемент» — абстрактная сущность, а на практике последовательность байт.

ARK>Если "начало" — это "адрес первого элемента", а конец — это "адрес последнего элемента",


В этом месте проблема.

Начало массива ― адрес первого байта массива, совпадает с адресом первого байта первого элемента. Тут трудностей не возникает.

Конец же массива не может указывать на данные внутри массива. Это не адрес последнего элемента, потому что тогда данные элемента могут лежать за концом массива — глупость получается. Единственный рациональный вариант, который работает для однобайтовых и многобайтовых элементов, считать концом массива адрес первого байта за пределами последнего элемента массива. Как бонус, конец последнего элемента совпадает с концом всего массива.

Так обычно и принято задавать диапазоны: начало ― адрес/индекс/указатель на первый элемент, конец ― адрес/индекс/указатель на нечто после последнего элемента. Inclusive start, exclusive end.

Ну или второй популярный вариант: адрес/индекс/указатель на начало последовательности и количество элементов. Всю жизнь в NET API использовали второй вариант. Но по сути это одно и то же, переводится друг в друга одной арифметической операцией: start + length = end или end — start = length.

ARK>Только оператор ^ — это не индекс, а какая-то странная сущность.



Обычный унарный оператор, только новый применительно к целым числам.