我有一个方法可以对DataTable做一些工作,例如
private void MyMethod(DataTable table)
{
if(table.Rows.Count > 0)
{
// do some work
}
}
但是,如果方法从它所服务的应用程序接收到空数据表,我会得到一个未设置为对象实例的' Object引用。错误。
我也试过了。 。
if(table.IsInitialized) { }
和
if(table != null) { }
但是我收到了同样的错误消息。
我如何测试是否实例化传入的数据表而不是null?
DataTable来自WinForms应用程序中的数据网格的转换,即
DataTable table = (DataTable)datagridview.DataSource;
因此,如果原始datagridview为空,则会出现问题。
答案 0 :(得分:4)
你得到"引用未设置为对象的实例"如果您遇到这样的情况会例外:
object someObject = null;
//Throws an exception. You try to call a instance function without specify the instance
someObject.ToString();
因此,无论是表为null还是行返回null。 在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 但是,它仍然是相同的代码。
答案 1 :(得分:2)
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
答案 2 :(得分:0)
如何测试是否实例化传入的数据表 请问?
从技术上讲,这应该有效,如果下面的代码没有检测到table
是否被实例化,那么除了手头的问题之外还有另一个问题。
if(table != null && table.Rows != null && table.Rows.Count > 0)
答案 3 :(得分:0)
我知道这是一个已有两年历史的问题,但是现在在C#中有一种简单的方法可以解决此问题,如下所示:
if ((dataTableName?.Rows?.Count ?? 0) > 0)