- PVSM.RU - https://www.pvsm.ru -
В продолжении статьи «8 фактов, которые вы, возможно, не знали о C#» [1] описывающей интересные моменты языка C#, представляю крохотный очерк. Очень жаль, что некоторые воспринимают такие статьи как “капитанство” отбивая всякое желание к написанию, но несмотря на это, в комментариях, порой, всплывает много полезной информации.
Итак, что возвращают функции поиска индекса в массивах, если элемент не найден?
Предположим у нас есть метод возвращающий Array:
Array GetArray() { return … }
И код который ищет в нем число:
Array array = GetArray();
int index = Array.IndexOf(array, 42);
if (index != -1)
{
// do something
}
Все знакомо и привычно, но сверившись с документацией, с удивлением обнаруживаем что методы IndexOf(Array ...) [2], в случае не нахождения элемента возвращают не -1
, а нижнюю границу массива - 1
.
Отсюда вытекает два вывода:
1. Можно создать массив начинающийся не с 0.
2. Код выше некорректен.
Пример создания массива не с 0:
Array array = Array.CreateInstance(typeof(int), new int[] { 3 }, new int[] { -1 });
В этом примере создается массив [3] из трех элементов, индексация начинается с -1
.
Правильный код выглядит следующим образом:
Array array = GetArray();
int index = Array.IndexOf(array, 42);
if (index != (array.GetLowerBound(0) - 1))
{
// do something
}
Я думаю эта особенность создана для языков платформы .NET где индексация начинается с 1.
Помимо этого, в документации описан отдельный случай, когда нижняя граница равна int.MinValue
. В этом случае метод IndexOf
вернет int.MaxValue
что соотвествует int.MinValue - 1
(переполнение).
Всем спасибо за внимание!
Автор: mynameco
Источник [4]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/net/43905
Ссылки в тексте:
[1] «8 фактов, которые вы, возможно, не знали о C#»: http://habrahabr.ru/post/178763/
[2] IndexOf(Array ...): http://msdn.microsoft.com/ru-ru/library/7eddebat.aspx
[3] создается массив: http://msdn.microsoft.com/ru-ru/library/x836773a.aspx
[4] Источник: http://habrahabr.ru/post/194626/
Нажмите здесь для печати.