Нужно ли мне избавиться от этого экземпляра изображения? - PullRequest
2 голосов
/ 25 ноября 2008

Я делаю простой визуализатор отладчика изображений. Код ниже. Я не уверен, нужно ли мне вручную удалять экземпляр 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();
        }
    }
}

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

Ответы [ 4 ]

2 голосов
/ 25 ноября 2008

Измените ваш метод показа на это:

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 в форме после закрытия, что также удалит все содержимое формы.

1 голос
/ 25 ноября 2008

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

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

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

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

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

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

1 голос
/ 25 ноября 2008

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

0 голосов
/ 25 ноября 2008

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

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

...