ArgumentException与ArgumentNullException?

时间:2011-12-10 20:48:27

标签: c# .net

我正在重构一些代码并添加一个方法来替换(即将推出)已弃用的方法。新方法具有以下特征:

FooResult Foo(FooArgs args) { ... }

不推荐使用的方法包含越来越多的参数。这些参数现在是FooArgs类的属性。不推荐使用的方法有几个保护条件,它使用以下结构检查空值:

if (parameter1 == null)
    throw new ArgumentNullException(“parameter1”);
if (parameter... == null)
    throw new ArgumentNullException(“parameter...”);
if (parameterN == null)
    throw new ArgumentNullException(“parameterN”);

既然已将参数折叠到FooArgs类中,我应该为FooArgs参数的各个属性抛出 ArgumentNullException

if (args.Property1 == null)
    throw new ArgumentNullException(“args.Property1”);
if (args.Property... == null)
    throw new ArgumentNullException(“args.Property...”);
if (args.PropertyN == null)
    throw new ArgumentNullException(“args.PropertyN”);

或者为整个 FooArgs参数抛出更一般的 ArgumentException

if (args.Property1 == null)
    throw new ArgumentException(“Property1 cannot be null.”, “args”);
if (args.Property... == null)
    throw new ArgumentException(“Property... cannot be null.”, “args”);
if (args.PropertyN == null)
    throw new ArgumentException(“Property2 cannot be null.”, “args”);

谢谢!

4 个答案:

答案 0 :(得分:26)

您需要将args本身的检查添加为非null。 ANE不适合单个组件,因此您需要使用更通用的AE,如下所示:

if (args == null)
    throw new ArgumentNullException(“args”);
if (args.Property1 == null)
    throw new ArgumentException(“Property1 cannot be null.”, “args”);
if (args.Property... == null)
    throw new ArgumentException(“Property... cannot be null.”, “args”);
if (args.PropertyN == null)
    throw new ArgumentException(“Property2 cannot be null.”, “args”);

答案 1 :(得分:10)

虽然我完全同意dasblinkenlight的回答,但您可能还需要考虑将FooArgs的验证转移到FooArgs类本身。如果这个类专门设计用于移动参数,那么它可能无效,因为它具有null proeprties,在这种情况下,我会允许它的构造函数进行验证。

答案 2 :(得分:2)

在这种情况下,最好检查该方法中FooArgs参数的空引用,如果传入了空引用,则抛出ArgumentNullException。然后,如果有其他方法或者代码段使用args类中包含的参数,它们应该是检查它并根据需要抛出异常的参数。但是,如果您接受args类的方法是使用所有参数的方法,那么最好按照您的建议检查该方法中的有效参数。

此外,仅将ArgumentNullException用于空引用的参数。如果它只是一个无效值(例如一个空字符串),那么你应该使用更通用的ArgumentException

答案 3 :(得分:1)

这取决于您的工具以及您对工具的感觉(resharper,fxcops等)。一些静态代码分析工具接受这个:

throw new ArgumentNullException(“args.Property...”,"args");

并拒绝此

throw new ArgumentNullException(“args.Property...”,"args.Property");

因此,如果您想使用工具,那么针对参数属性的null-hood断言必须抛出ArgumentException

随着你的进展,它也是有效的。将正确的消息传达给维护开发人员以帮助他正确传递参数的正确信息是什么。