为什么Resharper抱怨"可能' null'分配给标有' NotNull'的实体属性"对于Worksheet对象而不是其他对象?

时间:2015-12-02 21:51:20

标签: c# excel-interop worksheet comobject resharper-10.0

我已经使用此代码在Excel Interop应用程序中发布了一些COM对象:

    . . .
    }
    Marshal.ReleaseComObject(_xlSheet);

    Marshal.ReleaseComObject(_xlSheets);

    _xlBook.Close(false, null, null);
    Marshal.ReleaseComObject(_xlBook);

    _xlApp.DisplayAlerts = false;
    _xlApp.Quit();
    OnChanged(EventArgs.Empty);
} // foreach (DataRowView drv in selectedUnits)
Marshal.ReleaseComObject(_xlApp);

在另一个地方我也会发布那里使用的纸张:

Marshal.ReleaseComObject(_xlSheetDelPerf);

这一切都很好,但是Resharper Inspect>解决方案中的代码问题发现" 可能' null'分配给标有' NotNull'的实体属性"在两个ReleaseComObject()上调用Excel.Worksheet对象(但不调用Sheet,Workbook或Application对象)。它们的定义如下:

using Excel = Microsoft.Office.Interop.Excel;
. . .
private Excel.Application _xlApp;
private Excel.Workbook _xlBook;
private Excel.Sheets _xlSheets;
private Excel.Worksheet _xlSheet;
private Excel.Worksheet _xlSheetDelPerf;

是什么让工作表如此特殊?更重要的是,我应该删除它们的ReleaseComObject()代码吗?并使用别的东西来释放它们?

注意:问题的接受答案" 如何正确清理Excel互操作对象"通过VVS here,有474个upvotes,确实显示以这种方式发布的工作表......?!?

更新

好的,我遵循了MethodMan的建议(谁不会,这样的绰号?)现在我有了:

            // Free up resources
            Marshal.ReleaseComObject(_xlSheet);

            Marshal.ReleaseComObject(_xlSheets);

            _xlBook.Close(false, null, null);
            Marshal.ReleaseComObject(_xlBook);

            _xlApp.DisplayAlerts = false;
            _xlApp.Quit();

            _xlSheet = null;
            _xlSheets = null;
            _xlBook = null;
        } //if (_xlSheet != null)
        OnChanged(EventArgs.Empty);
    } // foreach (DataRowView drvu in selectedUnits)
    Marshal.ReleaseComObject(_xlApp);
    _xlApp = null;
} // try
finally
{
    GC.Collect();
}

0 个答案:

没有答案