gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:58:00 26 4
gpt4 key购买 nike

假设我有一个扩展方法

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

为了验证参数 e,我应该:

A) if (e == null) 抛出新的 NullReferenceException()
B) 如果 (e == null) 抛出新的 ArgumentNullException("e")
C) 不检查 e

共识是什么?

我的第一个想法是始终验证参数,因此引发了 ArgumentNullException。再者,由于 TakeRandom() 成为 e 的方法,也许它应该是 NullReferenceException。但如果它是 NullReferenceException,如果我尝试在 TakeRandom() 中使用 e 的成员,NullReferenceException 无论如何都会被抛出。

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

最佳答案

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

不要忘记,扩展方法只是引擎盖下的静态方法,可以这样调用。虽然在扩展方法上抛出 NullReferenceException 表面上看起来是有意义的,但对于静态方法这样做是没有意义的。无法确定方法中的调用约定,因此 ArgumentException 是更好的选择。

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

这也接近于以下的欺骗

关于C#:验证扩展方法中的 "this"参数的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/788218/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com