处理方法参数的null属性的最佳方法

时间:2015-07-22 16:29:26

标签: c#

检查方法的参数时,如果它为空,我会抛出ArgumentNullException。请参阅以下方法中的第一行。但是参数的属性不应该是空的呢?如果我尝试以相同的方式处理它们,我会收到代码分析错误:

  

CA2208正确实例化参数异常方法   ' PriorityDeratingComponentLogic.CreateItem(IvSimulation)'通行证   ' ivSimulation.SolarPanel'作为' paramName'争论一个   ' ArgumentNullException'构造函数。用以下之一替换此参数   方法的参数名称。请注意提供的参数名称   应该具有方法中声明的确切外壳。

public DeratingComponentBase CreateItem(IvSimulation ivSimulation)
{
    if (ivSimulation == null) { throw new ArgumentNullException("ivSimulation"); }
    if (ivSimulation.SolarPanel == null) { throw new ArgumentNullException("ivSimulation.SolarPanel"); }
    if (ivSimulation.GlobalEquipment == null) { throw new ArgumentNullException("ivSimulation.GlobalEquipment"); }

    // ... method body here
}

CA错误是我应该抑制的,还是有一种普遍接受的方式来更好地处理这个问题?也许问题是上游问题,我们甚至不应该检查这些属性是否为空?

2 个答案:

答案 0 :(得分:5)

投掷ArgumentNullException旨在表明参数本身为null。但是,当其中一个参数组件为null但参数本身不是时,正确的异常为ArgumentException,参数名称为参数:

if (ivSimulation.GlobalEquipment == null) {
    throw new ArgumentException("GlobalEquipment cannot be null", "ivSimulation");
 }

这提供了有关消息中错误的信息,同时将ivSimulation指定为参数名称。

注意:我认为您无法在GlobalEquipment的构造函数中验证IvSimulation,因为抛出ArgumentNullException将是一个非常有效的选择那个构造函数。

答案 1 :(得分:1)

可以认为非null参数变量的null属性实际上不是null参数,因此ArgumentNullException在这种情况下实际上并不合适。 (显然,其他人可能不同意,这很好。)这对我来说就像一个质的不同的情况。该参数不会丢失,但它处于无效状态。我想我会在这样的情况下使用InvalidOperationException,其中一个对象处于无效状态。