Подтвердить что ты не робот

Должен ли я возвращать 'null' или пустой массив?

Предположим, что у вас есть метод, который должен создавать и возвращать массив некоторого типа. Что делать, если массив не заполняется. Вы возвращаете пустой массив или null/ничего?

4b9b3361

Ответ 1

В .NET лучше возвращать пустой массив, чем null, поскольку он сохраняет вызывающего абонента для записи нулевой проверки и/или риска NullReferenceException; вы увидите, что это общий шаблон в библиотеках базового класса. Единственный случай, когда вы не делаете этого, - в маловероятном сценарии, что пустой массив и нуль имеют разные смысловые значения.

официальные правила использования массива:

Общее правило: пустое, пустое string ("") и пустые (0 элементов) массивы следует лечить одинаково. Вернуть пустой массив вместо нулевого ссылка.

Тем не менее, если вы используете .NET 2.0 или более позднюю версию, гораздо лучше вернуть IEnumerable<T> или одну из ее расширяемых производных, таких как Collection<T>, ReadOnlyCollection<T>, ICollection<T> или IList<T> ( в этом случае я бы все же хотел вернуть пустой, а не null). Дополнительная информация о том, почему они должны быть предпочтительными, можно найти в блоге Eric Lippert.

Ответ 2

Я возвращаю пустой массив - кажется, что это правильно.

Ответ 3

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

Ответ 4

Если вы внимательно прочитаете свой вопрос, вы поймете, что на самом деле вы уже сами ответили на него: вы написали "метод, который должен создавать и возвращать массив какого-то рода", а не "метод, который должен создавать и, возможно, возвращать массив какого-либо типа или нет".

Действительно, это зависит от спецификации. Но так, как вы это сформулировали, метод не может возвращать null. Какой стиль я бы предпочел в любом случае, он просто упрощает обработку краевых дел.

Ответ 5

Это действительно зависит от того, что вызывающий абонент хочет сделать с результатом.

Обычно я возвращаю пустой массив (или Collection, в Java). Это потому, что я обычно проходил цикл и, возможно, добавлял их в коллекцию, а затем возвращал. Проверка в конце, если Collection.size() == 0 - дополнительный шаг. А затем вызывающему нужно добавить дополнительную проверку, чтобы увидеть, равен ли результат 0, и если да, избегайте повторения коллекции.

Я ценю, что может быть чище вернуть null, но это проще, если только у меня нет причин.

Ответ 6

Если это действительно независимое от языка, я бы вернул пустой объект массива, у большинства контейнеров должна быть функция, такая как IsEmpty(), поэтому вызывающая функция проверяет, действительно ли Array IsEmpty, прежде чем они что-нибудь с ней сделают.

Если это в С++, я вижу, что он либо имеет значение null, либо если вы переданы в ссылку на массив, тогда вы возвращаете размер массива...

Ответ 7

Я возвращаю то, что ожидает вызывающий. Если функция должна возвращать "все объекты, для которых X истинна", а X не является истиной для любых объектов, я возвращаю пустой массив.

если функция даже не могла выполнить этот поиск для "объектов, для которых X является истинным", то она не удалась и должна как-то сигнализировать об этом вызывающему абоненту. Это можно сделать, возвращая null.

Ответ 8

Если по какой-то причине в вашем коде есть различие в значении, для результата, являющегося нулевым массивом, стирает простой старый пустой, я возвращаю пустой. Это также может быть специфическим для языка. На некоторых языках у вас может быть только один вариант.

Ответ 9

Я бы предположил, что это зависит от того, как язык обрабатывает его.

В C я передаю указатели вокруг и всегда включаю указатель, размер массива. Затем вызывающая функция должна обеспечивать две вещи: массив и размер массива. если функция не заполняет массив, она просто возвращает тот же указатель назад и ничего не делает для размера массива. Обычно я просто реализую структуру векторного типа и работаю с этим.

В perl размер массива обрабатывается неявно, поэтому я просто возвращаю пустой массив или, если ошибка, изменяю переменную кода ошибки и возвращаю undef.

В java я использую ArrayLists и использую свойство size.

Ответ 10

Если вам посчастливилось использовать С#, объявите статическое свойство readonly следующим образом:

public static class ArrayUtil<TElement> 
{
    public static readonly Empty = new TElement[0];
}

(Это в BCL? Почему бы и нет?)

Теперь вы можете вернуть ArrayUtil<int>.Empty или что-то еще. Это в значительной степени устраняет затраты времени на использование пустого массива вместо нуля и дает вызывающему абоненту более простое время, чем иметь дело с нулями.

Ответ 11

Ответ зависит от контракта между вызывающим и функцией. Если вы намерены помечать массив как недействительный, то null - лучший способ сделать это, чем возвращать массив нулевого размера, поскольку массив нулевого размера может быть допустимым результатом в некоторой ситуации.

Ответ 12

Ну, это действительно зависит от семантики, которую вы хотите дать вашему возвращению.

Обычно я использую условия pre и post для почти всех моих функций/методов. Это означает, что если мой метод должен возвращать массив с данными определенного лечения, если это лечение не выполняется, объект должен быть нулевым, а состояние сообщения не будет выполнено.

Но в вашем случае я предполагаю, что вы не используете DbC, поэтому, если я ссылаюсь только на ваш вопрос:

Что делать, если массив не заполняется.

Тогда я бы возвратил null, поскольку я предполагал, что что-то пошло не так в вашей фразировке.