Должен ли я проверить, прошел ли список <T>пусто - PullRequest
3 голосов
/ 05 марта 2012

Метод расширения ожидает открытого универсального IEnumerable.

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

У меня есть мнение, что список никогда не должен быть нулевым, но иметь счетчик== 0.

Как вы справляетесь с таким случаем?

ОБНОВЛЕНИЕ:

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

Ответы [ 4 ]

6 голосов
/ 05 марта 2012

Это зависит.

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

if (list == null)
{
    throw new ArgumentNullException("some suitable message");
}

Если список, являющийся нулевым, эквивалентен списку, существующему, но не имеющему элементов, то допустим для этого:

if (list == null || list.Count() == 0)
{
    .....
}
1 голос
/ 05 марта 2012

Да, вы должны это проверить.Это также довольно распространенный шаблон в этом случае, особенно в LINQ:

public static void MyExtension<T>(this IEnumerable<T> source)
{
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }

    // ...
}

Обработка пустого списка намного проще, чем обработка экземпляра списка с нулевым значением.Думайте об этом таким образом;Список без предметов - просто пустая коллекция - довольно распространенный случай.Список, который является нулевым ... представляет что? Исключительная ситуация , и должна обрабатываться как таковая.

Обновление:

Я посмотрел вокруг, что скажет Microsoft о моих предположениях о том, что бросаниеANE - это общая схема (в отличие от того, чтобы позволить CLR генерировать NRE - что в точках может быть слишком расплывчатым), и это кажется правильным.Мы можем найти на странице документации ANE , что:

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

И позже, в разделе "Рекомендации по проектированию структуры" Исключение раздел:

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

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

0 голосов
/ 05 марта 2012

Обычно я хочу получить исключение, но иногда (особенно при использовании стороннего кода) обработка нуля как пустого экземпляра более удобна:

public static class FrameworkExtensions
{
    /// <summary>
    /// null tolerant access to a Collection
    /// 
    /// usage:
    /// foreach (int i in returnArray.AsNotNull())
    /// {
    ///     // do some more stuff
    /// }
    /// </summary>
    /// <typeparam name="T">Type of collection</typeparam>
    /// <param name="original"></param>
    /// <returns></returns>
    public static IEnumerable<T> AsNotNull<T>(this IEnumerable<T> original)
    {
        return original ?? new T[0];
    }
}
0 голосов
/ 05 марта 2012

Обновлено:

Я полагаю, вы имеете в виду передачу списка в качестве параметра метода, но в этом случае решение очевидно (даже проверка самого объекта):

public static void ExtensionMethod<T>(this IEnumerable<T> list,
                                      IEnumerable<T> anOtherlist)
{
    bool listItselfNotNull = list != null;
    bool anOtherListNotNull = anOtherList != null;
}
...