Лучше вернуть ноль или пустую коллекцию? - PullRequest
4 голосов
/ 07 декабря 2010

Предположим, у меня есть метод, который возвращает массив или список или некоторую другую коллекцию.Если что-то идет не так внутри или когда просто нет данных для возврата, что лучше - вернуть ноль или вернуть массив (список и т. Д.), Длина (число) которого равно 0?это важно, или это просто вопрос предпочтений разработчика?

Ответы [ 9 ]

9 голосов
/ 07 декабря 2010

Лучше вернуть пустую коллекцию.Таким образом, когда кто-то вызывает функцию следующим образом:

foreach(var i in items)
{

}

она не выдает исключение нулевой ссылки на них.

Технически, вы можете утверждать, что пусто против null означает,но на самом деле многие люди (включая меня) иногда забывают о защите и не проверяют, является ли объект нулевым, прежде чем использовать его.Это играет на том, что другие люди предполагают, что произойдет, что означает меньше ошибок и меньше злых пользователей.

4 голосов
/ 07 декабря 2010

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

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

1 голос
/ 07 декабря 2010

Если что-то "идет не так", вы должны выбросить исключение. Если нет данных для возврата, верните пустую коллекцию. Как правило, разработчики не должны удивляться NullReferenceException, когда они просят список предметов, и просто не может быть ничего, чтобы вернуться.

0 голосов
/ 23 мая 2014

Вот статья Джоша Блоха, объясняющая то же самое. Он написан в контексте Java, но он должен применяться к C # одинаково хорошо. Возвращает массивы нулевой длины, а не нули

0 голосов
/ 05 августа 2011

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

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

Мне нравится думать о NULL - не пытался понять, есть ли что-то, может быть, есть кто, но кто знает.

Пустая коллекция - пытались заполнить, и что касается системы, там нет предметов, что является довольно сильным утверждением.

например. Бумажник. Коллекция заметок.

  • NULL - я не открыл свой кошелек, поэтому не знаю, есть ли в нем какие-либо заметки.
  • List = {} - Я проверил, и у меня точно нет заметок, потому что я потратил все это на пиво.
0 голосов
/ 07 декабря 2010

Это действительно предпочтение разработчика.

Возвращение пустого списка

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

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

Возврат значения null

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

0 голосов
/ 07 декабря 2010

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

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

Если что-то действительно пошло не так, почему вы не можете выбросить исключение?

0 голосов
/ 07 декабря 2010

Я мог видеть, что это происходит в любом случае. В конечном итоге массив или коллекция с большей площадью занимаемой площади, но является «более безопасным» в том смысле, что если результат будет использоваться в будущих foreach / итерациях, результат будет пропущен через блок кода и не закончится исключением нулевого объекта.

0 голосов
/ 07 декабря 2010

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

Допустим, у вас есть объект, который содержит член коллекции.

public class Customer {
    private IList<Order> _orders;

    public Customer() {
        _orders = new List<Order>();
    }

    public IList<Order> Orders {
        get {
            return _orders;
        } 
    }
}

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

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

Другой пример, при выполнении итерации по коллекции, такой как:

foreach (Order o in c.Orders) {
    // Do something here...
}

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

Это зависит от сценария, в котором вы работаете.

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