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

わんくま同盟

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

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


(過去ログ 171 を表示中)
■98337 / )  using 文とインスタンスの破棄
□投稿者/ 星は昴 (11回)-(2021/11/02(Tue) 19:36:10)

分類:[C#] 

 98334 に続くインスタンスの生成と破棄シリーズ第3弾です(笑)。連投恐れ入ります。

 Pb はデザイナーで貼り付けたPictureBox です。以下の@ABに対する疑問に答えていただければ幸いです。

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);
        if (Pb.Image != null)
        {
          Pb.Image.Dispose();
        }
        Pb.Image = bmp;
      }
      catch
      {
        MessageBox.Show("これは画像ファイルではありません", "エラー",
                MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
      }
    }
  }

  //小さな画像を PictureBox.BackgroundImage に敷き詰める
  private void BtnTile_Click(object sender, EventArgs e)
  {
    if (bmp.Width < 60 || bmp.Width > 120) { return; }
    if (bmp.Height < 60 || bmp.Height > 120) { return; }

    Bitmap backbmp = new Bitmap(bmp.Width, bmp.Height);
    Graphics g = Graphics.FromImage(backbmp); // @new はなぜ不要なのか?
    g.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height);
    Pb.Width = bmp.Width * 10;
    Pb.Height = bmp.Height * 8;
    Pb.BackgroundImage = backbmp;
    Pb.BackgroundImageLayout = ImageLayout.Tile;
    Pb.Invalidate();
    g.Dispose(); //これはOKで
    //backbmp.Dispose(); が実行エラーとなるのはなぜか A
    
    /* インスタンスの破棄は C# のGCに任せればいいのだろうが、やはり気になるのでネット
    を検索したら using 文で囲めば Dispose は不要とあったので、見よう見まねで以下のよ
    うにコーディングしたら、あっさり実行エラー B
    using (var backbmp = new Bitmap(bmp.Width, bmp.Height))
    {
      Graphics g = Graphics.FromImage(backbmp);
      g.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height);
      Pb.Width = bmp.Width * 10;
      Pb.Height = bmp.Height * 8;
      Pb.BackgroundImage = backbmp;
      Pb.BackgroundImageLayout = ImageLayout.Tile;
      Pb.Invalidate();
    }
    */
  }
}

返信 編集キー/


管理者用

- Child Tree -