Нужно ли мне избавиться от этого экземпляра изображения?

StackOverflow https://stackoverflow.com/questions/317400

  •  11-07-2019
  •  | 
  •  

Вопрос

Я делаю простой визуализатор Image Debugger. Код ниже. Я не уверен, нужно ли мне вручную удалять экземпляр Image? Поскольку я делаю окно формы Windows и PictureBox внутри, который содержит мое динамическое изображение ... мне нужно добавить специальный код, когда форма заканчивается, чтобы избавиться от этого?

вот код ..

using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.VisualStudio.DebuggerVisualizers;
using DebuggerVisualizers;

[assembly: DebuggerVisualizer(
    typeof (ImageDebuggerVisualizer),
    typeof (VisualizerObjectSource),
    Target = typeof (Image),
    Description = "Image Visualizer")]

namespace DebuggerVisualizers
{
    public class ImageDebuggerVisualizer : DialogDebuggerVisualizer
    {
        protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
        {
            Image image = (Image) objectProvider.GetObject();
            Form form = new Form
                           {
                               Text = ("Image Visualizer - " + image.HorizontalResolution + " " + image.VerticalResolution),
                               Width = image.Width,
                               Height = image.Height
                           };

            PictureBox pictureBox = new PictureBox {Image = image, SizeMode = PictureBoxSizeMode.AutoSize};
            form.Controls.Add(pictureBox);
            form.ShowDialog();
        }
    }
}

спасибо за любую помощь:)

Это было полезно?

Решение

Измените свой метод Show на этот:

protected override void Show(IDialogVisualizerService windowService,
    IVisualizerObjectProvider objectProvider)        
{            
    Image image = (Image) objectProvider.GetObject();
    using (Form form = new Form())
    {            
        PictureBox pictureBox = new PictureBox();    
        pictureBox.Image = image;        
        form.Controls.Add(pictureBox); 
        form.ShowDialog();
    } 
}

Блок using () {} будет вызывать Dispose в форме после закрытия, что также приведет к удалению всего в форме.

Другие советы

Элемент управления Picture Box не располагает изображением, так что вам решать, да.

Хм, я собираюсь выйти на конечность и сказать, что вы не должны избавляться от нее.

Я никогда не создавал визуализатор, и я точно не знаю, Visual Studio это делает, но мне кажется, что если вы избавляетесь от объекта в визуализаторе, вы можете нарушить код, который вы отлаживаете.

Все сводится к этой строке:

Image image = (Image) objectProvider.GetObject();

Если этот объект не является клоном, вы будете уничтожать объект, созданный отлаживаемым кодом. Код не будет ожидать, что этот объект будет внезапно удален, и S поразит вентилятор, заставив вас, по крайней мере, перезапустить отладку.

Я буду осторожен и НЕ избавлюсь от этого. Подумай об этом - ты отлаживаешь. Это не длительный процесс. Если вы потеряете дескриптор растрового изображения, это не конец света ...

Я думаю, ты должен избавиться от этого. Это должно быть довольно просто, просто добавьте использование () в первой строке вашего метода (вокруг строки Image image = ...) и завершите его после form.ShowDialog ().

Я думаю, что утилизировать изображение безопасно, поскольку, если вы хотите изменить визуализируемый объект, вы должны вызвать один из методов TransferData / TranferObject / ReplaceDat / ReplaceObject, чтобы отправить его обратно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top