当前位置: 首页 > 编程语言 > C#

扩展方法的ArgumentNullException或NullReferenceException?分享ArgumentNullException或NullReferenceExceptionfor

时间:2023-04-10 15:26:21 C#

扩展方法?您认为在使用null实例调用扩展方法时抛出的最佳异常类型是什么(哪些扩展方法不允许)?由于扩展方法只是静态方法,您可以说它应该是ArgumentNullException,但另一方面,它们像实例方法一样使用,因此使用NullReferenceException可能更自然。让我们看一下下面的例子:publicstaticstringToInvariantString(thisIFormattablevalue,stringformat){这样,如果value参数为null,就会抛出NullReferenceException。另一个例子是:publicstaticstringToInvariantString(thisIFormattablevalue,stringformat){if(value==null)thrownewArgumentNullException("value");返回值.ToString(格式,CultureInfo.InvariantCulture);编辑:在一些答案中,你已经指出扩展方法可以像静态方法一样被调用,在这种情况下空引用异常会出错,这是一个很好的观点,实际上我很关心,不知道为什么我首先忘记在问题中提及这一点。也有人指出抛出NullReferenceException是错误的,是的,确实如此。这就是为什么我不抛出它,我只是让它发生(让CLR抛出它)而不保护方法。我想我赞成ArgumentNullException(这是我到目前为止使用的方法),但我仍然认为至少有投票反对NullReferenceException的空间,因为在大多数将要使用该方法的地方,它似乎更自然。通常,包括异常在内,您应该将扩展方法视为普通的静态方法。在这种情况下,您应该抛出ArgumentNullException。出于某些原因,抛出NullReferenceException是个坏主意,请参阅何时可以捕获StackOverflowException(我关于此主题的帖子)。除了所有其他答案(这些答案都很好)之外,我认为值得看看微软为一致性所做的工作......据我所知,Enumerable中的扩展方法都会抛出ArgumentNullException。由于扩展方法在C#2.0中可用,并且可以像静态方法一样调用它们(您不必将它们用作扩展方法),因此您应该使用ArgumentNullException。仅仅因为它们看起来像一种类型的方法并不意味着它们是,或者将永远被称为一个。从用户的角度来看,该方法看起来像一个实例方法,所以如果我是他们,我希望看到NullReferenceException。也就是说,我建议在代码中明确地抛出一个或另一个,而不是像第一个示例中那样“碰巧”抛出一个。参数空异常。不需要将扩展??方法称为实例方法。您可以称它们为普通方法。在这种情况下,NullReferenceException是完全不正确的。以上就是C#学习教程:扩展方法的ArgumentNullExceptionorNullReferenceException?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: