このImageインスタンスを破棄する必要がありますか?
-
11-07-2019 - |
質問
単純なImage Debugger Visualizerを作成しています。コードは次のとおりです。 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を呼び出します。これにより、フォーム上のすべてのものも破棄されます。
他のヒント
ピクチャボックスコントロールは画像を破棄しないため、これはユーザー次第です。
ええと、私はここで手足に出て、あなたはそれを処分すべきではないと言います。
ビジュアライザーを作成したことはなく、Visual Studioがこれを行うことを正確には知りませんが、ビジュアライザーでオブジェクトを破棄すると、デバッグしているコードが破損する可能性があるようです。
すべては次の行になります:
Image image = (Image) objectProvider.GetObject();
そのオブジェクトがクローンではない場合、デバッグされているコードによって作成されたオブジェクトを破棄します。コードはそのオブジェクトが突然破棄されることを予期しておらず、Sがファンにヒットするため、少なくともデバッグを再開する必要があります。
安全にプレイしますが、廃棄しないでください。考えてみてください-デバッグしています。それは長続きするプロセスではありません。ビットマップハンドルをリークした場合、それは世界の終わりではありません...
廃棄する必要があると思います。メソッドの最初の行(Image image = ...行の周り)にusing()を追加し、form.ShowDialog()の後に終了するだけです。
画像を破棄しても安全だと思います。視覚化されたオブジェクトを変更する場合は、TransferData / TranferObject / ReplaceDat / ReplaceObjectメソッドのいずれかを呼び出して返送する必要があります。