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(); は実行エラー
//では、どこに書けばいいのか?
}
No.2ベストアンサー
- 回答日時:
using( var backbmp = new Bitmap(bmp.Width, bmp.Height) ){...}
で括るのが、良いかと。
何ならgもusingで括る。
すばやいありがとうございます。私の持っている「やさしいC#」(高橋麻奈 著)には using については名前空間に関するusingディレクティブの説明はありますが、Disposeメソッドを省略できるusingステートメントについてまったく言及されていません。
C# using
でググったら、回答内容を理解できました。
No.1
- 回答日時:
C# は普通にインスタンスを作った場合は、破棄を気にしないでもいいようです。
だから、backbmpの破棄は書かなくてもいいのだと思います。
そして、Graphicsは管理外のメモリを使っているのかもしれません。
ちなみに、Excelファイルを操作する処理などでCOMなどを使うと、同様にC#の管理外のメモリが確保されたりするそうです。
この場合は、Disposeしてあげないといけないようで、それをきちんとやらないとExcelのプロセスが残ってしまうようです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- その他(プログラミング・Web制作) Pythonにおける物理のシミュレーションでの単位変換について 2 2023/06/02 17:11
- その他(プログラミング・Web制作) Pythonでのかんたんな物理シミュレーションについての書籍 5 2023/06/02 07:37
- Visual Basic(VBA) Visual Basic : ImageListの画像がそろったときにメッセージを表示 1 2023/07/20 13:53
- その他(プログラミング・Web制作) Pythonによる物理の斜方投射の位置座標表示について 2 2023/06/05 12:46
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- JavaScript vertical sliderをautoplayしたい 2 2022/08/25 14:47
- その他(プログラミング・Web制作) ボールの動きがスムーズに動いてかつ目盛り線描画を維持するためには 4 2023/05/31 10:01
- JavaScript 画像の表示位置 3 2022/12/23 08:25
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
生成したインスタンスを削除す...
-
変数名の付け方
-
複数の変数を宣言する時、同時...
-
private static という変数の修飾
-
インスタンス参照でアクセスで...
-
VB.NET getとsetの概念がわかり...
-
エクセル(複数インスタンス)...
-
インスタンスを同じ名前で作成...
-
外部ライブラリの動的参照によ...
-
他のファイルの変数参照
-
データベースから日付型を取得...
-
Eclipse3でVisualEditorが起動...
-
c++の課題で クラスのオブジェ...
-
VB.netで標準モジュールからフ...
-
newしないインスタンス?実体化...
-
javaのクラスの作り方、エラー...
-
C#「オブジェクト参照が必要で...
-
C#において、同じインスタンス...
-
VB6.0で、DLLを動的に参照したい
-
C# インスタンスの破棄
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
複数の変数を宣言する時、同時...
-
private static という変数の修飾
-
VB.NET getとsetの概念がわかり...
-
C#において、同じインスタンス...
-
生成したインスタンスを削除す...
-
C# インスタンスの破棄
-
newしないインスタンス?実体化...
-
SQLを連続発行する時の正しい(?...
-
「インスタンス」の意味をわか...
-
文字列を日付に変換でParseExce...
-
変数の参照でエラーが出てしま...
-
フォームの存在をチェックする方法
-
javaのクラスの作り方、エラー...
-
オブジェクト参照がオブジェク...
-
String a = "a"; と String b =...
-
C#「オブジェクト参照が必要で...
-
エクセル(複数インスタンス)...
-
他のファイルの変数参照
おすすめ情報