当前位置:  开发笔记 > 编程语言 > 正文

在哪里检查对象是否为空?

如何解决《在哪里检查对象是否为空?》经验,为你挑选了2个好方法。

在哪里检查传递给方法的对象是否为空?

在调用方法之前是否需要测试对象?或者在使用参数的方法中?

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.我想知道这是否是一种被广泛接受的做法.



1> Daniel Brück..:

如果您设计一个库,将会有暴露于外部世界的方法.您应该检查此方法中的传入数据.在您不公开的方法中不需要检查,因为只有您的代码调用它们,并且它的逻辑应该处理您在被调用的公开方法中接受的所有情况.

                    --------------------------
                   |                          |
                   |         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
}

整个想法是拒绝你无法处理的案件并妥善处理所有剩余的案件.如果输入无效,则抛出异常.这会强制库调用者仅提供有效值,并且不允许调用者继续使用无意义的返回值执行(除了调用者使异常继续执行).



2> Jon Skeet..:

你没有什么可以检查Main- 你使用的new运算符永远不会返回null(除了Nullable).

办理登机手续是完全合理的PrintAge,特别是如果公开的话.(对于私有API,进行参数检查并不重要,但它仍然非常有用.)

if (person == null)
{
    throw new ArgumentNullException("person");
}

现在在C#3.0中,我通常使用扩展方法.

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有