C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: インスタンスの生成と破棄


(過去ログ 170 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■98330 / inTopicNo.1)  インスタンスの生成と破棄
  
□投稿者/ 星は昴 (6回)-(2021/11/02(Tue) 04:08:37)

分類:[C#] 

 以下のコードは一応意図したとおり動くのですが、気になるのはファイルを読み込むたびに Bitmap のインスタンスが生成される(つまり複数生成されるのではないか?)のでちょっと不安ですし、これでなぜまともに動くのが不思議です。
 特に問題はないのでしょうか?

 @を
  Bitmap bmp = new Bitmap(); //これはエラーになる
としてインスタンスを 1 回だけ生成し、後はそれを使い回してAでは
  bmp を使って dialog.FileName を読み込む
のようにできるものならばすっきりするのですが、そういったことはできそうにもありません。
 
public partial class Form1 : Form
{
  Bitmap bmp; //@各イベントハンドラで共有して使うためここで宣言

  private void BtnFileOpen_Click(object sender, EventArgs e)
  {
    OpenFileDialog dialog = new OpenFileDialog();
    if (dialog.ShowDialog() == DialogResult.OK)
    {
      try
      {
        bmp = new Bitmap(dialog.FileName); //Aインスタンス生成
        PictureBox1.Image = bmp;
      }
      catch
      {
        MessageBox.Show("これは画像ファイルではありません", "エラー",
                MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
      }
    }
  }

  private void Rotation_Click(object sender, EventArgs e)
  {
    if (Pb.Image != null)
    {
      bmp = (Bitmap)Pb.Image;
      bmp.RotateFlip(RotateFlipType.Rotate90FlipNone); // 90°回転
      PictureBox1.Image = bmp;
    }
  }

  private void BtnInversion_Click(object sender, EventArgs e)
  {
    if (Pb.Image != null)
    {
      bmp = (Bitmap)Pb.Image;
      bmp.RotateFlip(RotateFlipType.RotateNoneFlipX); // 水平反転
      PictureBox1.Image = bmp;
    }
  }

  private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  {
    bmp.Dispose(); //解放
  }
}

引用返信 編集キー/
■98331 / inTopicNo.2)  Re[1]: インスタンスの生成と破棄
□投稿者/ KOZ (165回)-(2021/11/02(Tue) 05:33:16)
No98330 (星は昴 さん) に返信

Pb.Image ってなんでしょうか? PictureBox1.Image の間違いですか?

>  以下のコードは一応意図したとおり動くのですが、気になるのはファイルを読み込むたびに Bitmap のインスタンスが生成される(つまり複数生成されるのではないか?)のでちょっと不安ですし、これでなぜまともに動くのが不思議です。

参照されなくなった Bitmap オブジェクトは、そのうち GC が回収しますが、気になるのであれば

bmp = new Bitmap(dialog.FileName); 
if (PictureBox1.Image != null)
{
    PictureBox1.Image.Dispose();
}
PictureBox1.Image = bmp;

のようにすればいいと思います。

インスタンス共有のために@の変数を用意しているのであれば、 Rotation_Click/BtnInversion_Click は

private void Rotation_Click(object sender, EventArgs e)
{
    if (bmp != null)
    {
        bmp.RotateFlip(RotateFlipType.Rotate90FlipNone); // 90°回転
        PictureBox1.Invalidate();
    }
}

private void BtnInversion_Click(object sender, EventArgs e)
{
    if (bmp != null)
    {
        bmp.RotateFlip(RotateFlipType.RotateNoneFlipX); // 水平反転
        PictureBox1.Invalidate();
    }
}

でいいでしょう。

>   private void Form1_FormClosing(object sender, FormClosingEventArgs e)
>   {
>     bmp.Dispose(); //解放
>   }
> }

BtnFileOpen をクリックしないでフォームを閉じると異常終了しますね。

引用返信 編集キー/
■98332 / inTopicNo.3)  Re[2]: インスタンスの生成と破棄
□投稿者/ 星は昴 (7回)-(2021/11/02(Tue) 08:09:55)
No98331 (KOZ さん) に返信
> Pb.Image ってなんでしょうか? PictureBox1.Image の間違いですか?
 そうでした。いつもPbと名付けて使っていますので(笑)。

> 参照されなくなった Bitmap オブジェクトは、そのうち GC が回収しますが、気になるのであれば
 MS-DOS時代にCと苦闘していましたので、気になるんですよねえ(笑)。
 詳細な解説ありがとうございます。どの指摘も大変勉強になりました。

引用返信 編集キー/
■98333 / inTopicNo.4)  Re[3]: インスタンスの生成と破棄
□投稿者/ 星は昴 (8回)-(2021/11/02(Tue) 08:10:45)
解決済みをチェックし忘れました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -