我有一个方法可以在数据表上做一些工作,例如
private void MyMethod(DataTable table)
{
if(table.Rows.Count > 0)
{
// do some work
}
}
但是,如果该方法从它提供的应用程序接收空数据表,则会出现"对象引用未设置为对象的实例"错误。
我也试过。
。 。if(table.IsInitialized) { }
和
if(table != null) { }
但我收到相同的错误消息。
如何测试以查看传入的数据表是否已实例化而不是空?
数据表来自WinForms应用程序中的数据网格的转换,即
DataTable table = (DataTable)datagridview.DataSource;
因此,如果原始数据网格视图为空,则会出现问题。
如果您遇到这样的情况,则会出现"引用未设置为对象的实例"异常:
object someObject = null;
//Throws an exception. You try to call a instance function without specify the instance
someObject.ToString();
因此,要么表为空,要么行返回空。在 C# 6.0 之前,您必须走艰难的道路:
if(table != null && table.Rows != null && table.Rows.Count > 0)
我假设计数不是一个可为空的整数。如果是,您当然也必须检查它是否为空。
至少对于调试,您可能希望使用"每行一个操作"规则更详细地编写该代码。这将帮助您找到哪个操作确切返回 null。无论如何,JiT 很可能会在调试运行之外删除临时变量。
//If table is null, exception here
var Row = table.Row;
//If Row is null, Exception here.
var Count = Row.Count;
//Nothing is null. Continue.
if(Count > 0);
在 C# 6.0 中,新的 Null 条件运算符可以将其编写得更短一些:https://msdn.microsoft.com/en-us/library/dn986595.aspx但是,它仍然是相同的代码。
table != null
应该可以工作。
下面是一个示例:
using System;
using System.Data;
public class Program
{
public static void Main()
{
DataTable table = null;
Test(table);
table = new DataTable();
Test(table);
}
public static void Test(DataTable table)
{
if(table == null)
{
Console.WriteLine("table is null");
return;
}
if(table.IsInitialized == false)
{
Console.WriteLine("table is not initalised.");
return;
}
Console.WriteLine("table row count: " + table.Rows.Count);
}
}
输出:
table is null
table row count: 0
https://dotnetfiddle.net/0s2Jp8
如何测试以查看传入的数据表是否已实例化而不是 请空?
从技术上讲,这应该有效,如果下面的代码没有检测到table
是否已实例化,那么除了手头的问题之外,还有另一个问题。
if(table != null && table.Rows != null && table.Rows.Count > 0)
我知道这是一个几年前的问题,但是现在有一种简单的方法可以在 C# 中解决这个问题,如下所示:
if ((dataTableName?.Rows?.Count ?? 0) > 0)