mj8*_*j82 15 .net c# exception-handling
我想知道代码验证方法的参数在哪里 - 以及多久 - .
在下面的示例类(.dll库)中,您认为最好的方法是什么?假设我想验证,某些对象不能null(但它可以是方法正常运行所需的任何其他验证).最好只在第1点检查一次,在用户可用的公共方法中,以及后来的"信任自己",在其他私有方法中,它不会为空,或者更好的有点偏执并且每个都检查一下时间它将被使用(在点2. 3.和4.)
如果我决定使用这些私有方法更改类中的某些内容,并且"忘记"传递有效对象,那么在使用该对象之前检查它(在第2,3,4点)将来会保护我.如果我将来添加一些新的公共方法,我也不必记住验证.另一方面 - 它一遍又一遍地检查相同的条件.或许你还有其他一些建议?
public class MyClass()
{
public MyClass()
{
}
public void ProcessObject(SomeObject obj)
{
//1. if (obj == null) throw new ArgumentException("You must provide valid object.");
DoSomething(obj);
DoMore(obj);
DoSomethingElse(obj);
}
private void DoSomething(SomeObject obj)
{
//2. if (obj == null) throw new ArgumenException("You must provide valid object.");
//do something with obj...
}
private void DoMore(SomeObject obj)
{
//3. if (obj == null) throw new ArgumentException("You must provide valid object.");
//do something with obj...
}
private void DoSomethingElse(SomeObject obj)
{
//4. if (obj == null) throw new ArgumentException("You must provide valid object.");
//do something with obj..
}
}
Run Code Online (Sandbox Code Playgroud)
Mat*_*hew 12
如果它是你要让其他开发人员使用的API,那么在你的每个方法中你都应该抛出ArgumentException或者ArgumentNullException.
如果它是其他开发人员不会直接与之交互的内部类或方法,我会使用Debug.Assert,因此在调试模式下,您将获得额外的调试信息,并且在发布模式下它会被删除,并且您将获得不执行所有这些参数的性能优势到处检查.
在一个好的软件设计方法中,需要彼此独立.您必须能够以任何顺序使用它们并相互分离.所以是的,你必须一遍又一遍地检查所有方法中的相同条件.
编辑: 我会使用CodeContract与Pre-Condition检查obj不为null.因为这似乎是方法正常工作的先决条件.