Должен ли я вернуть 'NULL' или пустой массив? - PullRequest
16 голосов
/ 02 декабря 2008

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

Ответы [ 12 ]

28 голосов
/ 02 декабря 2008

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

Официальное руководство по использованию массива состояние:

Общее правило: пустой, пустой строковые ("") и пустые (0 позиций) массивы следует относиться так же. Вернуть пустой массив вместо нуля ссылка.

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

2 голосов
/ 02 декабря 2008

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

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

2 голосов
/ 02 декабря 2008

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

2 голосов
/ 02 декабря 2008

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

1 голос
/ 02 декабря 2008

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

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

1 голос
/ 02 декабря 2008

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

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

1 голос
/ 02 декабря 2008

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

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

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

0 голосов
/ 02 декабря 2008

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

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

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

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

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

0 голосов
/ 02 декабря 2008

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

0 голосов
/ 02 декабря 2008

Если вам повезло использовать C #, объявите статическое свойство только для чтения, например:

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

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

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

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