Я должен возвратить 'пустой указатель' или пустой массив?

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

16
задан Jay Bazuzi 1 December 2008 в 21:49
поделиться

12 ответов

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

чиновник выстраивают инструкции по использованию состояние:

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

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

Eric Lippert
28
ответ дан 30 November 2019 в 16:42
поделиться

Я возвращаюсь, пустой массив - просто походит на правильный поступок.

2
ответ дан 30 November 2019 в 16:42
поделиться

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

2
ответ дан 30 November 2019 в 16:42
поделиться

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

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

2
ответ дан 30 November 2019 в 16:42
поделиться

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

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

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

1
ответ дан 30 November 2019 в 16:42
поделиться

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

, Если это находится в C++ I, видят его или собирающийся аннулировать, или если Вы передаетесь в ссылке на массив тогда, Вы возвращаете размер массива...

1
ответ дан 30 November 2019 в 16:42
поделиться

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

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

1
ответ дан 30 November 2019 в 16:42
поделиться

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

0
ответ дан 30 November 2019 в 16:42
поделиться

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

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

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

В Java, я использую ArrayLists и использую свойство размера.

0
ответ дан 30 November 2019 в 16:42
поделиться

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

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

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

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

0
ответ дан 30 November 2019 в 16:42
поделиться

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

0
ответ дан 30 November 2019 в 16:42
поделиться

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

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

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

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

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

0
ответ дан 30 November 2019 в 16:42
поделиться
Другие вопросы по тегам:

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