| ■No98257 (Megumi さん) に返信 > 以下のコードではフォームに貼り付けた Pb(PictureBox)に画像が読み込まれていないと例外が発生します。
NullReferenceException は例外処理で拾って処理するものでは無く、 開発者側で「そもそも発生させないように気を配る」類の代物なので、 この場合は「Pb に画像が読み込まれているかどうか」を調べるべきかと思います。
Bitmap canvas = new Bitmap(Pb.Width, Pb.Height); Pb.Image = canvas; Image img = Pb.Image; if (img != null) // 画像が読み込まれているか? { using (img) using (Graphics g = Graphics.FromImage(canvas)) { g.TranslateTransform(120, 0);//ワールド変換行列を右に平行移動する g.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height)); } }
> finally > { > g.Dispose(); //これは OK なのに > img.Dispose(); //現在のコンテキストに img という名前は存在しないコンパイルエラーが出る! > Pb.Image = canvas; > }
んんん……!? 『img という名前は存在しない』というエラーではなく、 『未割り当てのローカル変数 'img' が使用されました。』ではありませんでしたか?
g 変数の方は、代入行為が try 句の外で行われているので、 g.Dispose() に到達した時点では、g が初期化済みであることが明確です。
一方で img 変数は、try 句の「img = Pb.Image;」という代入行為が失敗していた場合において、 変数の中身が、null さえもセットされていない状態ということになります。 そのようなオブジェクトを操作することは許可されないため、未割当を示す CS0165 エラーになるはず。 |