代码之家  ›  专栏  ›  技术社区  ›  core

C#:在扩展方法中验证“this”参数的最佳实践

  •  6
  • core  · 技术社区  · 17 年前

    假设我有一个扩展方法

    public static T TakeRandom<T>(this IEnumerable<T> e)
    {
        ...
    

    A) if(e==null)抛出新的NullReferenceException()
    B) if(e==null)抛出新的ArgumentNullException(“e”)

    共识是什么?

    也许我应该使用Reflector并找出框架的作用。

    3 回复  |  直到 17 年前
        1
  •  11
  •   Community Mohan Dere    9 年前

    您应该抛出ArgumentNullException。您正在尝试进行参数验证,因此应该抛出一个调整为参数验证的异常。NullReferenceException不是参数验证异常。这是一个运行时错误。

    此外,您永远不应该显式抛出NullReferenceException。这只能由CLR抛出。当显式抛出通常仅由CLR抛出的异常时,会出现微妙的差异。

    这也接近于对以下内容的欺骗

        2
  •  4
  •   itowlson    17 年前

    为了和Enumerable LINQ运算符保持一致,请抛出ArgumentNullException(不是NullReferenceException)。

    我会在TakeRandom方法中进行验证,因为堆栈跟踪将明确表示TakeRandom反对给定null参数。

        3
  •  1
  •   Chad Grant    17 年前

    也许我疯了,但既然这是一个论点,我会抛出ArgumentNullException:/

    不过,一般的经验法则是抛出源自系统的异常。可能时出现应用程序异常。NullReferenceException是框架/CLR会抛出的异常。

    http://msdn.microsoft.com/en-us/library/system.exception(VS.71).aspx

    存在两类例外情况 在基类异常下:

    预定义的通用语言 从派生的运行时异常类 系统异常。用户定义 派生的应用程序异常类 来自ApplicationException。