2009-06-27 2 views
48

Я получаю это предупреждение от FxCop:Как расширить метод Dispose WinForm?

«„RestartForm“содержит поле„RestartForm.done“, который имеет тип IDisposable:.„“ManualResetEvent Измените метод Dispose на„“RestartForm вызвать Dispose или Close на этом поле ".

Хорошо, я понимаю, что это значит и почему это то, что должно быть сделано ... Кроме System.Windows.Forms.Form не позволяет переопределить либо .Close() или .Dispose(), так что делать? В настоящее время я работаю с этим решением:

private void RestartForm_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     done.Set(); 
     done.Close(); 
    } 

Что работает для моего приложения ... Но FxCop все еще показывает это сообщение. Я покрыл и могу ли я смело игнорировать его, или есть ли другой способ, которым я должен это делать?

+2

Вы также можете подписаться на Disposed события в конструкторе, если вы не хотите, чтобы коснуться дизайнер сгенерированный код. – arbiter

ответ

86

Вам необходимо переопределить метод Dispose из Form

Обычно это автоматически переопределен в файле RestartForm.Designer.cs, так что вам нужно будет переместить разместите в своем файле кода, чтобы вы могли добавить любой код, который вам нужно добавить, без его переписывания дизайнером.

В RestartForm.cs

protected override void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
    if (components != null) 
    { 
     components.Dispose(); 
    } 

    // Dispose stuff here 
    } 

    base.Dispose(disposing); 
} 
+5

Это именно то, чего мне не хватало ... Я даже не подумал проверить, помещал ли дизайнер его в автогенерированный код ... Объясняет, почему он не был в списке переопределений, он уже был реализован, просто нет мной! –

+0

Где я могу разместить свои вещи в случае, если 'disposing' и' components! = Null' оцениваются в одной строке? Например. 'if (disposing && (components! = null))' (по умолчанию для vs2013) –

+1

@firsttimer, логика такая же. Вам нужно перенести метод из файла вашего дизайнера, а затем разбить условия. ваш код должен выглядеть, как мой пример выше, когда вы закончите. – heavyd

0

Вам необходимо переопределить метод Dispose, этот метод comes from the Control базовый класс

protected override void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
    event.Dispose(); 
    } 
    base.Dispose(disposing); 
} 
2

Если RestartForm расширяет System.Windows.Forms.Form, вы должны быть в состоянии отменить Dispose (BOOL утилизации). Вы должны правильно реализовать это для своего класса «RestartForm», чтобы избавиться от своих IDisposables.

Он должен выглядеть следующим образом:

public override Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
     // Dispose was called from user code. Dispose of managed resources here. 
     done.Dispose(); 
    } 

    // Dispose of unmanaged resources here, and invoke base dispose. 
    base.Dispose(disposing); 
} 
6

Я использую этот метод :)

  Image bgImage = Image.FromFile(workingDir + "\\" + button.BackgroundImage); 
      currentButton.Image = bgImage; 
      currentButton.Disposed += (Object sndr, EventArgs evnt) => bgImage.Dispose(); 
Смежные вопросы