C# 在引用之前检查对象是否存在

Mik*_*e H 0 c# epplus

我想知道是否有一种方法可以在引用之前检查对象是否存在。不仅仅是检查它是否为空,因为这也不起作用。我正在使用 EPPlus 包来读取 Excel 文件,当它到达一个没有任何值数据的索引时,它会发送一个异常。

private DataTable WorksheetToDataTable(string tableName)
{
    excelSheet = excelWorkbook.Worksheets[tableName];
    DataTable dt = new DataTable();
    try
    {
        int totalRows = excelSheet.Dimension.End.Row;
        int totalCols = excelSheet.Dimension.End.Column;
        for (int j = 1; j <= totalCols; j++)
        {

            dt.Columns.Add();
            for (int i = 1; i <= totalRows; i++)
            {
                if (j == 1)
                {
                    dt.Rows.Add();
                }
                try
                {
                    dt.Rows[i - 1][j - 1] = excelSheet.Cells[i, j].Value.ToString();
                    //dt.Rows[i - 1][j - 1] = Object.ReferenceEquals(null, excelSheet.Cells[i, j].Value.ToString()) ? "" : excelSheet.Cells[i, j].Value.ToString();
                }
                catch
                {
                    dt.Rows[i - 1][j - 1] = "";
                }
            }
        }
        return dt;
    }
    catch
    {
        MessageBox.Show("Error: Referenced Excel Table is empty, or indexed improperly! Check Excel formatting.", "Error");
        return dt;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以你可以看到我之前尝试检查是否excelSheet.Cells[i, j].Value.ToString()为空,并且它发送了在上面的 try/catch 中捕获的相同异常。我必须解析很多单元格,其中很多单元格将完全是空的,这增加了很多

抛出异常:BBSApp.exe 中的“System.NullReferenceException”

到输出控制台。有没有办法在调用对象之前检查对象是否存在,甚至在不使用 try/catch 的情况下检查它是否为空?

if(excelSheet.Cells[i, j].Value.ToString() != null)
Run Code Online (Sandbox Code Playgroud)

简单地检查它是否为空(如上所示)会发送相同的异常,因为它首先不存在。

Mic*_*ael 5

尝试这个:

if(excelSheet.Cells[i, j].Value != null)
Run Code Online (Sandbox Code Playgroud)

您正在检查该Value属性是否为空。发生空引用异常是因为您尝试调用对象ToString()上的方法null

或者,您可以使用 null 访问运算符:

if(excelSheet.Cells[i, j]?.Value?.ToString() != null)
Run Code Online (Sandbox Code Playgroud)

  • “?? null”是多余的,因为它的基本意思是“如果左侧为空,则使用也为空的右侧”。 (3认同)