CA2000 предупреждение об объекте уровня класса
У меня есть объект, который объявлен на уровне класса, который дает предупреждение CA2000. Как я могу избавиться от предупреждения CA2000 из кода ниже?
public partial class someclass : Window
{
System.Windows.Forms.OpenFileDialog dlg = new System.Windows.Forms.OpenFileDialog()
{
AddExtension = true,
CheckFileExists = true,
CheckPathExists = true,
DefaultExt = "xsd",
FileName = lastFileName,
Filter = "XML Schema Definitions (*.xsd)|*.xsd|All Files (*.*)|*.*",
InitialDirectory = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop),
RestoreDirectory = true,
Title = "Open an XML Schema Definition File"
};
}
Предупреждение - Предупреждение CA2000 В методе 'SIMPathFinder.SIMPathFinder()' объект 'new OpenFileDialog()' расположен не по всем путям исключений. Вызовите System.IDisposable.Dispose для объекта 'new OpenFileDialog()' до того, как все ссылки на него выйдут из области видимости.
1 ответ
CA2000 говорит, что экземпляры вашего класса владеют одноразовым объектом, который следует утилизировать для освобождения использованных (неуправляемых) ресурсов до того, как экземпляр вашего класса выйдет из области видимости.
Распространенным способом сделать это является реализация IDisposable
интерфейс и protected virtual Dispose
метод:
public partial class someclass : Window, IDisposable // implement IDisposable
{
// shortened for brevity
System.Windows.Forms.OpenFileDialog dlg = new System.Windows.Forms.OpenFileDialog();
protected virtual void Dispose(bool disposing)
{
if (disposing)
dlg.Dispose(); // dispose the dialog
}
public void Dispose() // IDisposable implementation
{
Dispose(true);
// tell the GC that there's no need for a finalizer call
GC.SuppressFinalize(this);
}
}
Узнайте больше о Dispose-Pattern
В качестве примечания: кажется, вы смешиваете WPF и Windows Forms. Вы наследуете от Window
(который я предполагаю System.Windows.Window
так как ваш вопрос помечен как wpf), но попробуйте использовать System.Windows.Forms.OpenFileDialog
,
Смешивать эти две структуры пользовательского интерфейса не очень хорошая идея. использование Microsoft.Win32.OpenFileDialog
вместо.