Нужно ли мне избавиться от этого экземпляра изображения?
-
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, чтобы отправить его обратно.