Использование выписок и форм - PullRequest
2 голосов
/ 31 августа 2011

У меня есть базовая форма, которая будет пытаться загрузить и воспроизвести видео пользователя.Форма может быть вызвана из открытого статического метода ShowDialogForm.Этот метод попытается инициализировать видео в случае успеха, затем возвращается форма, в противном случае действие отменяется.В моем офисе мы используем инструмент рефакторинга, и он жалуется на отсутствие инструкции использования в моем методе.Так что мой вопрос положительный, если таковой вообще есть в предложении использования оператора.

Это оригинальный код

public static DialogResult ShowDialogForm(VideoNames videoName, Course course, IWin32Window parent)
{
   FlashPlayer form = new FlashPlayer();

   if (form.Initialize(videoName, course))
   {
     return form.ShowDialog(parent);
   }
   else
   {
     return DialogResult.Cancel;
   }
}

Это код, предложенный инструментом рефакторинга

public static DialogResult ShowDialogForm(VideoNames videoName, Course course, IWin32Window parent)
{
  using (FlashPlayer form = new FlashPlayer())
  {
    if (form.Initialize(videoName, course))
    {
      return form.ShowDialog(parent);
    }
    else
    {
      return DialogResult.Cancel;
    }
  }
}

Ответы [ 5 ]

2 голосов
/ 31 августа 2011

Да, вы должны инкапсулировать любые объекты, которые реализуют IDisposable, в блоке using, чтобы гарантировать, что он правильно утилизируется GC.Вы должны быть особенно осведомлены об этом в приложении winforms или wpf, где память и процессы должны контролироваться более жестко.

1 голос
/ 31 августа 2011

Ну, жалоба инструмента действительна. Когда вы отображаете форму с помощью ShowDialog (), тогда объект формы не удаляется автоматически, как при использовании Show (). Это важно, вы обычно используете диалог, чтобы позволить пользователю вводить значения, которые вы затем получаете после возврата ShowDialog. Распределение элементов управления формой делает это рискованным и может вызвать исключение ObjectDisposedException.

Таким образом, вы всегда заключаете диалоговое окно создания, отображения и получения результатов в с помощью оператора , чтобы форма располагалась после того, как все сделано.

Обратите внимание, что вы фактически не используете это диалоговое окно для получения чего-либо. Что, вероятно, означает, что это вообще не должен быть диалог. Так что используйте Show (), и вам не нужно избавляться от него. И пользователь получает свободу продолжать использовать остальную часть вашего пользовательского интерфейса, при условии, что это подходит. Немодальные пользовательские интерфейсы всегда предпочтительнее.

1 голос
/ 31 августа 2011

Ваш инструмент правильный. Поскольку формы одноразовые, как только вы закончите с этим. Вы должны распоряжаться. Использование операторов делает это автоматически.

1 голос
/ 31 августа 2011

Преимущество может быть незначительным, но если IDisposable реализован в классе, оператор using обеспечивает безопасное выполнение кода.Если класс реализует его, скорее всего, для этого есть причина.

1 голос
/ 31 августа 2011

Оператор using обернет ваше использование FlashPlayer 'IDisposable' в блок try-finally, что означает, что FlashPlayer будет удален, когда вы закончите.Это считается хорошей практикой, так как освобождает ресурс.

Обычно, если что-то реализует IDisposable, рекомендуется заключить его в оператор использования или очистить вручную после вызова flashPlayer.Dispose().

...