ArrayList по сравнению со списком <объект>

Примечание: Неопределенный индекс

Случается, когда вы пытаетесь получить доступ к массиву с помощью ключа, который не существует в массиве.

Типичным примером для уведомления Undefined Index будет ( demo )

$data = array('foo' => '42', 'bar');
echo $data['spinach'];
echo $data[1];

Оба spinach и 1 не существуют в массив, вызывающий запуск E_NOTICE .

Решение состоит в том, чтобы убедиться, что индекс или смещение существуют до доступа к этому индексу. Это может означать, что вам необходимо исправить ошибку в вашей программе, чтобы убедиться, что эти индексы существуют, когда вы ожидаете их. Или это может означать, что вам нужно проверить, существуют ли индексы с помощью array_key_exists или isset :

$data = array('foo' => '42', 'bar');
if (array_key_exists('spinach', $data)) {
    echo $data['spinach'];
}
else {
    echo 'No key spinach in array';
}

Если у вас есть код например:


...

, тогда $_POST['message'] не будет установлена, когда эта страница будет загружена первой, и вы получите указанную выше ошибку. Только когда форма будет отправлена ​​и этот код будет запущен во второй раз, будет существовать индекс массива. Вы обычно проверяете это с помощью:

if ($_POST)  ..  // if the $_POST array is not empty
// or
if ($_SERVER['REQUEST_METHOD'] == 'POST') ..  // page was requested with POST

Вопросы, относящиеся:

46
задан Community 23 May 2017 в 12:25
поделиться

6 ответов

Вы будете в состоянии использовать дополнительные методы LINQ непосредственно с List<object>, но не с ArrayList, если Вы не введете Cast<object>() / OfType<object> (благодаря IEnumerable<object> по сравнению с IEnumerable). Это стоит вполне немного, даже если Вам не будет нужна безопасность типов и т.д.

, то скорость будет о том же; структуры будут все еще упакованы, и т.д. - таким образом, не будет очень еще, чтобы сказать им независимо. За исключением того, что я склонен видеть ArrayList как "ой, кто-то пишет унаследованный код снова...";-p

74
ответ дан Marc Gravell 26 November 2019 в 20:09
поделиться

Одно большое преимущество для использования List<object> - то, что в эти дни большая часть кода записана для использования универсальных классов/интерфейсов. Я подозреваю, что в эти дни большинство людей записало бы метод, который берет IList<object> вместо IList. С тех пор ArrayList не реализует IList<object>, Вы не были бы в состоянии использовать список массива в этих сценариях.

я склонен думать о неуниверсальных классах/интерфейсах как об унаследованном коде и избегать их, когда это возможно.

42
ответ дан Marc Gravell 26 November 2019 в 20:09
поделиться

В этом случае ArrayList по сравнению с List<Object> тогда Вы не заметите различий в скорости. Могли бы быть некоторые различия в фактических методах, доступных на каждом из них, конкретных в.NET 3.5 и подсчет дополнительных методов, но это больше имеет отношение к ArrayList, несколько удержавшему от использования, чем что-либо еще.

11
ответ дан angry person 26 November 2019 в 20:09
поделиться

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

Из MSDN ( http://msdn.microsoft.com/en-us/library/system.collections.generic.aspx )

Система. Наборы. Универсальный пространство имен содержит интерфейсы и классы, которые определяют универсальные наборы, которые позволяют пользователям создавать наборы со строгим контролем типов, которые обеспечивают лучшую безопасность типов и производительность, чем неуниверсальные наборы со строгим контролем типов.

5
ответ дан Tamas Czinege 26 November 2019 в 20:09
поделиться

Сделайте некоторое сравнительное тестирование, и Вы будете знать то, что работает лучше всего. Я приблизительно оцениваю, что различие является очень небольшим.

1
ответ дан tuinstoel 26 November 2019 в 20:09
поделиться

List<> безопасная с точки зрения типов версия ArrayList. Это гарантирует, что Вы получите тот же тип объекта в наборе.

-4
ответ дан Funky81 26 November 2019 в 20:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: