在哪里检查传递给方法的对象是否为空?
在调用方法之前是否需要测试对象?或者在使用参数的方法中?
public class Program { public static void Main(string[] args) { // Check if person is null here? or within PrintAge? PrintAge(new Person { Age = 1 }); } private static void PrintAge(Person person) { // check if person is null here? Console.WriteLine("Age = {0}", person.Age); } } public class Person { public int Age { get; set; } }
在两个类中进行"空"检查似乎是太多的冗余代码.
[编辑]:在调用者或被调用者中检查空值会有什么好处?
[编辑方面2]:我刚刚遇到防御性编程,似乎它主张在被调用者中检查null.我想知道这是否是一种被广泛接受的做法.
如果您设计一个库,将会有暴露于外部世界的方法.您应该检查此方法中的传入数据.在您不公开的方法中不需要检查,因为只有您的代码调用它们,并且它的逻辑应该处理您在被调用的公开方法中接受的所有情况.
-------------------------- | | | Library | | | ------- --------- ---------- | | | | | | | | | Outer | | Library | | Library | | | | ===> | Entry | ===> | Backend/ | | | World | | Method | | Helpers | | | | | | | | | ------- --------- ---------- | | | | | --------------------------
如果您已在条目方法中接受了提供的数据,则应执行请求的操作并返回预期结果,即处理所有剩余案例.
UPDATE
清除库内的情况.可能存在空检查,但仅仅是因为逻辑,而不是因为参数验证.在库内部进行空检查的位置有两种可能性.如果被调用的方法知道如何处理空值,则第一个.
private CallingMethod() { CalledMethod(someData); } private CalledMethod(Object parameter) { if (parameter == null) { // Do something } else { // Do something else } }
如果你调用一个无法处理空值的方法,第二种情况.
private CallingMethod() { if (someData == null) { // Do the work myself or call another method } else { CalledMethod(someData); } } private CalledMethod(Object parameter) { // Do something }
整个想法是拒绝你无法处理的案件并妥善处理所有剩余的案件.如果输入无效,则抛出异常.这会强制库调用者仅提供有效值,并且不允许调用者继续使用无意义的返回值执行(除了调用者使异常继续执行).
你没有什么可以检查Main
- 你使用的new
运算符永远不会返回null(除了Nullable
).
办理登机手续是完全合理的PrintAge
,特别是如果公开的话.(对于私有API,进行参数检查并不重要,但它仍然非常有用.)
if (person == null) { throw new ArgumentNullException("person"); }
现在在C#3.0中,我通常使用扩展方法.