Почему Resharper жалуется на "Возможное" нулевое "назначение сущности, отмеченной атрибутом" NotNull "" для объектов рабочей таблицы, но не для других?

У меня есть этот код для выпуска некоторых COM-объектов в приложении Excel Interop:

    . . .
    }
    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 > Code Issues в Solution обнаруживает " возможное" нулевое "назначение для объекта, отмеченного атрибутом NotNull " в двух вызовах ReleaseComObject() для объектов Excel.Worksheet (но не для Sheet, Книга или объекты приложения). Они определены так:

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, с 474 ответами, показывает, что лист освобождается таким образом...?!?

ОБНОВИТЬ

Хорошо, я последовал совету 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 ответов

Другие вопросы по тегам