在C#中使用返回值编写空引用的更好方法

时间:2018-10-01 13:23:44

标签: c# null-check

是否有更好的方法编写此空检查?我正在检查DataSet中的表是否为空。

if (dataSet == null || dataSet.Tables == null || dataSet.Tables[0].Rows == null)
{
    Console.WriteLine($"Error at {nameof(dataSet)}");
    return vatPeriodList;
}

我正在ADO.NET中工作。

2 个答案:

答案 0 :(得分:4)

您的支票没有意义,也忘记了一项重要事项。

  • DataSet.Tables也不能为null,因为它是只读属性,不能分配null,所以第二次检查毫无意义。
  • dataSet.Tables[0].Rows不能为null,因为它是只读属性,您不能分配null,所以最后的检查是多余的。

但是您忘记了DataSet可能为空,因此其中不包含任何DataTables。在这种情况下,您的if会在dataSet.Tables[0]处引发异常。

我会使用:

int? firstTablesRowCount = dataSet?.Tables.Cast<DataTable>().FirstOrDefault()?.Rows.Count;
if (firstTablesRowCount.GetValueOrDefault() == 0)
{
    Console.WriteLine($"Error at {nameof(dataSet)}");
}

这可确保DataSet不为null并包含表,并且第一个表包含行。

答案 1 :(得分:1)

尝试

if(dataSet?.Tables?.FirstOrDefault()?.Rows == null) {}

FirstOrDefault()返回第一个条目,如果没有则返回null。