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

标签 .net null

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

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

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

在两个类中进行“空”检查似乎是多余的代码。

[编辑] :在调用者或被调用者中检查 null 有什么缺点/优点?

[编辑2] : 我刚碰到Defensive Programming它似乎提倡在被调用者中检查 null 。我想知道这是否是一种被广泛接受的做法。

最佳答案

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

                    --------------------------
                   |                          |
                   |         Library          |
                   |                          |
 -------        ---------        ----------   |
|       |      |         |      |          |  |
| Outer |      | Library |      | Library  |  |
|       | ===> | Entry   | ===> | Backend/ |  |
| World |      | Method  |      | Helpers  |  |
|       |      |         |      |          |  |
 -------        ---------        ----------   |
                   |                          |
                   |                          |
                    --------------------------
如果您在 entry 方法中接受了提供的数据,您应该执行请求的操作并返回预期的结果,即处理所有剩余的情况。
更新
澄清图书馆内的情况。可能有空检查,但只是因为逻辑,而不是因为参数验证。库中空检查的位置有两种可能性。第一个,如果被调用的方法知道如何处理空值。
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
}
整个想法是拒绝您无法立即处理的案件并处理全部 其余情况正常。如果输入无效,则抛出异常。这迫使库调用者仅提供有效值,并且不允许调用者继续执行无意义的返回值(除了调用者浅化异常并继续)。

关于.net - 在哪里检查对象是否为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/706263/

相关文章:

c# - Visual Studio的Windows Style中的图标的图标路径在哪里

java - 有谁能够帮助将此代码从 Java 转换为 .Net(vb 或 c#)

c# - 如何使用 EDMX 文件的映射生成 Entity Framework 6.x POCO 类?

java - 当所选选项具有空值时将嵌套对象设置为 null

c# - 可枚举的 OrderBy - 空值是否总是被视为高或低,这可以被视为稳定行为吗?

c# - 处理链式 linq-to-sql 查询表达式中的空值

c# - 在 Asp.net C# 中使用文件上传将数据从 .csv 导入 SQL Server

c - 什么是 C 中的空语句?

java - 为什么不调用检查 NULL 的 Optional.isEmpty() isNull()

c# - 可空字符串 (string?) 和初始化为可原谅空值的字符串 (字符串 s = null!) 之间有什么区别