プロが教えるわが家の防犯対策術!

C# はガベージコレクションが充実しているとのことなので、インスタンスの破棄はあまり神経質にならなくていいようなのですが、MS-DOS時代の C や Windows 98 で動く Delphi5 しか知らない私はやはり気になります。
 下のコードの backbmp はどこで破棄したらいいのでしょうか?

public partial class Form1 : Form
{
  Bitmap bmp;//各イベントハンドラで共有して使うためここで宣言

  public Form1()
  {
    InitializeComponent();
  }

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

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

// PictureBox1.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); //PictureBox1.BackgroundImage用に生成
    Graphics g = Graphics.FromImage(backbmp);
    g.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height);
    PictureBox1.Width = bmp.Width * 10;
    PictureBox1.Height = bmp.Height * 8;
    PictureBox1.BackgroundImage = backbmp;
    PictureBox1.BackgroundImageLayout = ImageLayout.Tile;
    PictureBox1.Invalidate();

    g.Dispose();//これはOK。というかネット上の情報では書くことを推奨されていることが多い。
    //backbmp.Dispose(); は実行エラー
    //では、どこに書けばいいのか?
  }

A 回答 (2件)

using( var backbmp = new Bitmap(bmp.Width, bmp.Height) ){...}


で括るのが、良いかと。
何ならgもusingで括る。
    • good
    • 0
この回答へのお礼

すばやいありがとうございます。私の持っている「やさしいC#」(高橋麻奈 著)には using については名前空間に関するusingディレクティブの説明はありますが、Disposeメソッドを省略できるusingステートメントについてまったく言及されていません。
C# using
でググったら、回答内容を理解できました。

お礼日時:2021/11/02 16:16

C# は普通にインスタンスを作った場合は、破棄を気にしないでもいいようです。


だから、backbmpの破棄は書かなくてもいいのだと思います。
そして、Graphicsは管理外のメモリを使っているのかもしれません。

ちなみに、Excelファイルを操作する処理などでCOMなどを使うと、同様にC#の管理外のメモリが確保されたりするそうです。
この場合は、Disposeしてあげないといけないようで、それをきちんとやらないとExcelのプロセスが残ってしまうようです。
    • good
    • 0
この回答へのお礼

すばやいありがとうございます。なかなか難しいのですね。

お礼日時:2021/11/02 16:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A