1

この関数を複数回呼び出すと、次のことが可能になります:

void Func(String spr, PictureBox pictureBox)
{
    ToolTip toolTip = new ToolTip();
    toolTip.Show(spr, pictureBox, 1000);
}

メモリリークが発生しますか?

関数が終了した後、ツールチップはまだ範囲外に出て自分自身を処分している可能性さえありますか?

最初の質問に対する答えが「はい」の場合、timer_tick から自己処理する独自のツールチップを作成することは良い解決策ですか?

public partial class MyToolTip : ToolTip
{
    public MyToolTip()
    {
        InitializeComponent();
        timer.Interval = this.AutomaticDelay;
    }

    private void timer_Tick(object sender, EventArgs e)
    {
        this.Dispose();
    }
}

この場合、これが必要ない場合、オブジェクトの寿命がわかっている他の場合に適用できますか、それとも設計が悪いだけですか?

同時に多くのツールチップを表示できるようにしたいので、このソリューションを選択しました。

4

2 に答える 2

5

メソッドが実行されたToolTip後もオブジェクトはメモリ内に存在し、メソッドが呼び出されるたびに新しいToolTipインスタンスが作成されます。既存のものを再利用することをお勧めしToolTipます。例えば

 ToolTip toolTip = new ToolTip();
 void Func(String spr, PictureBox pictureBox)
 {

     toolTip.Show(spr, pictureBox, 1000);
 }

複数のツールチップを編集 し、カスタム オブジェクトを必要とせずに (GC の外部で) 明示的に破棄するには、次のようなものを試すことができます (ややハック;)):

 var toolTip= new ToolTip();
 toolTip.Show(spr, pictureBox);
 new System.Threading.Timer(o => tt.Dispose(), null, 1000, System.Threading.Timeout.Infinite);

上記は機能しますが、おそらくタイマーを再利用する方がよいでしょう。

于 2012-06-14T18:02:25.797 に答える
0

ガベージ コレクターは、必要に応じて ToolTip が使用するメモリを最終的にクリアするため、メモリの破棄を心配する必要はありません。

それでも、ヒントを表示するたびに新しいツールヒントを作成するのではなく、単一の ToolTip オブジェクトを使用する方がはるかに優れています。

于 2012-06-14T18:05:36.570 に答える