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

わんくま同盟

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

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


(過去ログ 171 を表示中)
■98339 / )  Re[1]: using 文とインスタンスの破棄
□投稿者/ 魔界の仮面弁士 (3205回)-(2021/11/02(Tue) 22:53:19)
No98337 (星は昴 さん) に返信
> 98334 に続くインスタンスの生成と破棄シリーズ第3弾です(笑)。連投恐れ入ります。

IDisposable なオブジェクトは、PictureBox や Form や Timer、
OpenFileDialog や DataSet、Font や Brush や Graphics などなど多岐にわたりますが、
Dispose する必要が無いオブジェクトもあれば、利用者が迂闊に Dispose できないものもあるので
慣れるまでは分かりにくいですよね…。

とはいえ基本的には、「自分で生成した物は、もう使わなくなったら処分しろ」というルールです。
そして「他人が生成したもの」や「他でまだ使っているオブジェクト」は、勝手に処分してはいけません。


>  if (Pb.Image != null)
>  {
>    Pb.Image.Dispose();
>  }

ちなみに C#6 以降のバージョンでは、上記を
 Pb.Image?.Dispose();
と一行で書けます。


> private void BtnTile_Click(object sender, EventArgs e)
> {
>   if (bmp.Width < 60 || bmp.Width > 120) { return; }
>   if (bmp.Height < 60 || bmp.Height > 120) { return; }

ガード句として
 if (bmp == null) { return; }
も追加しておくことをお奨めします。

BtnFileOpen が押される前に BtnTile が押された場合、
NullReferenceException になってしまうと思うので。


> Graphics g = Graphics.FromImage(backbmp);
ここは
 using (Graphics g = Graphics.FromImage(backbmp))
を使った方が良いですね。
Bitmap と違って、他の場所で利用されているものでは無いため、
その場で処分してしまって構いません。


> Pb.Invalidate();
この行はあっても無くても同じかな。
返信 編集キー/


管理者用

- Child Tree -