by WebSurfer
2018年2月6日 17:02
リソースから画像を取得すると、取得するたび毎回新しい Bitmap オブジェクトが生成されるいう話を書きます。(元の話は MSDN Forum のスレッド「C#でのIF文を使ったフォーム背景画像の設定方法について」のものです)
Visual Studio 2015 のテンプレートから Windows Forms アプリを生成すると、Properties フォルダ下にリソースファイル Resources.resx と厳密に型指定されたリソースクラス Resources.Designer.cs が自動生成されます。上の画像は、そのリソースに .png ファイルを追加したものです。
そうすると、厳密に型指定されたリソースクラス Resources.Designer.cs に以下のコードが自動生成されて、image プロパティでリソースの .png ファイルから Bitmap オブジェクトを取得できるようになります。
internal static System.Drawing.Bitmap image {
get {
object obj =
ResourceManager.GetObject("image", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
image プロパティは ResourceManager.GetObject メソッドを使っているところに注目してください。
MSDN ライブラリ ResourceManager.GetObject メソッド (String, CultureInfo) の説明によると "同じ name パラメーターで GetObject メソッドを複数回呼び出した場合、戻り値が同じオブジェクトの参照になるとは限りません・・・" とありますが、画像の場合は毎回新しい Bitmap オブジェクトが生成されるようです。
上の画像で isEqual1 が false になることがそれを裏付けていると思います。isEqual2 は当然ながら true になります。
それがどうしたって言われそうですが、自分としては新しい発見だったということで備忘録として書いておくことにしました。(笑)