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 вместо.

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