C# 检查方法中的无效值

C# 检查方法中的无效值,c#,oop,C#,Oop,我正在试图找到正确的方法来编写有关检查无效值的代码。在我的例子中,无效值将为null。其他问题的问题是,它们属于特定情况,我对更一般的解决方案感兴趣 我有这样一个代码: if(input != null) { //do logic } else { throw new Exception(); } 公共类 { 私有只读对象m_内部使用对象; 私有第三方对象m_user;//第三方对象。 公共SomeClassobject内部使用对象 { m_internallyUsedObje

我正在试图找到正确的方法来编写有关检查无效值的代码。在我的例子中,无效值将为null。其他问题的问题是,它们属于特定情况,我对更一般的解决方案感兴趣

我有这样一个代码:

if(input != null) {
    //do logic
} else {
    throw new Exception();
}
公共类 { 私有只读对象m_内部使用对象; 私有第三方对象m_user;//第三方对象。 公共SomeClassobject内部使用对象 { m_internallyUsedObject=internallyUsedObject;//我们只想确保对象在某个类对象的整个生命周期内保持不变。 m_user=new ThirdPartyObject;//此处还不需要此对象。 } 公共无效剂量 { m_user.DoSomethingElsem_internallyUsedObject;//现在我们正在使用它,我们不确定是否允许空值。 } } 因为我们在构造函数中使用internallyUsedObject,所以我们可能知道这个对象的语义以及应该如何使用它。另一方面,我们只是在调用期间将此对象中继到第三方对象。 不管值是否为null,我们的SomeClass对象都可以正常工作

现在的问题是,我们不知道null是否总是适用于第三方对象-它可能在一个版本中工作,在这种情况下,可以忽略null检查而在另一个版本中不工作

可以说,如果我们的类能够处理null,我们就不应该关心null的检查。但是当我编写代码文档时,我想告诉用户我们自己类的行为和期望

如上所述,在特定的第三方对象版本中,此简单检查可能没有用处,甚至无效:

如果internallyUsedObject==null { 抛出新ArgumentNullExceptioninternallyUsedObject; }
根据OOP,当我们不打算直接使用internallyUsedObject时,从构造函数内部的上述代码中获取internallyUsedObject是否有效?这是否违反了原则,因为我们似乎只是将问题推迟到对象生命周期的后期?

作为一项规则,我倾向于使用您在第二个代码块中描述的方法,但与合理的检查分组相结合。我的意思是,在执行逻辑之前,应对特定方法进行某些检查并采取措施,例如:

public void MyMethod(MyObject input) {

    // 1. perhaps security checks, if an in method security is required
    if(security.AccessLevel < requiredLevel)
        throw new CustomSecurityException("Insufficent Access");

    // 2. data checks
    if(input.Property == null)
        throw new ArgumentNullException("Input didn't contain the value I wanted");

    if(input.Property2 < someImportantLevel)
        throw new CustomBLException("Input didn't meet required level for something");

    // 3. perform BL
    // ...do whatever

}

检查可能被隐藏或嵌套,并且更难定位。

只有当您知道ArgumentNullException不能为null时,我才会抛出ArgumentNullException,例如在DoSomethingElse中。ThirdPartyObject应该通过适当的文档使其行为完全清楚。如果它缺少适当的文档,则通过向其传递空值来测试它,并观察其行为。我想说,如果一个版本可以处理空值,而下一个版本不能,这将是一个突破性的变化,应该有一个非常令人信服的理由。但如果第一个版本不接受空值,而下一个版本开始接受空值,这将是非常好的。如果我在这种情况下检查null,它可能会变得无用,甚至可能会丢失部分功能。完成了,谢谢。希望这些问题是正确的。@paulius_l,不,这不是很好,特别是如果它在一个空参数的情况下改变了行为。