C# 扩展方法应该处理null吗?

C# 扩展方法应该处理null吗?,c#,extension-methods,C#,Extension Methods,这种不好的做法是返回空部分吗 你应该抛出一个异常。大多数.NETFramework扩展方法都是这样做的。或者,什么也不做,让ObservableCollection构造函数来做 public static ObservableCollection<TSource> ToObservableCollection<TSource>(this IEnumerable<TSource> source) { if (source == null)

这种不好的做法是返回空部分吗

你应该抛出一个异常。大多数.NETFramework扩展方法都是这样做的。或者,什么也不做,让ObservableCollection构造函数来做

public static ObservableCollection<TSource> ToObservableCollection<TSource>(this     IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }

    return new ObservableCollection<TSource>(source);
}

我写我的来处理空参数,所以我提倡空检查。扩展方法在IL代码中以不同的方式发出。它们作为类的静态方法发出,因此参数可以为null


更新:抛出异常或适当地处理null值是我在扩展方法中处理null值的方式。

如果对null使用方法,它不应该抛出null refexception,而不是像您那样隐藏它吗?编辑:或者至少是一些例外。不总是这样。String.IsNullOrEmpty就是一个很好的例子。NullReferenceException保留给CLR,不应由用户代码引发。请参见@martin_costello删除该支票将确保该支票已被抛出,无需亲自抛出,否则您可以抛出ArgumentNullException。@Blorgbeard不,不会。它被传递给构造函数,并且没有访问它的成员,因此没有空引用来调用成员。这可能比让异常发生得更深更好,因为这样他们就可以获得正确的参数名,并且不必怀疑他们无权访问的类中是否有其他错误。对于这类事情,越早越好。参数名称匹配的优点是。
public static ObservableCollection<TSource> ToObservableCollection<TSource>(this     IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }

    return new ObservableCollection<TSource>(source);
}