say if you say - 英語や考え事や日記ツールなど
2004年9月13日 Δ
コーディングミスでStackOverflowException
C# Tips
少し前に、再起呼び出しがないPGMでなぜか
StackOverflowExceptionが発生した。

コードを少し眺めたが、処理の流れがループするような
箇所が見当たらない。

仕方がないので、VisualStudioでステップ実行したところ、
あるクラスのプロパティ取得の箇所でループしていた。

で、よく見ると微妙に間違ってました・・・・。

プロパティで自分自身を参照するようなロジックを入れてしまうと、その処理が無限ループし、
StackOverflowException が発生してしまう。
特にオブジェクトなどで、先頭が大文字/小文字で
public・privateを判別している場合などに間違いやすいので注意したい。
やっぱprivateな変数には「_」(アンダースコア)つけた方がいいのかなぁ。


例:

public string SQLConnectionString
{
    get
    {
        if(SQLConnectionString == null)
↑自分のプロパティを参照してしまっている。(本来なら、strSQLConnectionStringを指定するはずだった)
        {
            strSQLConnectionString = getConfigValue("SQLConnectionString");
        }
    return strSQLConnectionString;
    }
}
2004年9月6日 Δ
ASP.NETで動的にPNGを生成する方法
C# Tips
普通にJpegなどの画像をASP.NETで動的に生成して、
Responseとして返す場合は、

using(Bitmap bmp = new Bitmap(intWidth,intHeight))
//略

//JPEG形式で描画
Response.ContentType = "image/JPEG";
bmp.Save(Response.OutputStream,ImageFormat.Jpeg);

というコーディングで可能だが、PNG形式にしたくてこれを
bmp.Save(Response.OutputStream,ImageFormat.Png);
と変えただけで、"A generic error occurred in GDI+. "とか言われてエラーになる。

色々ググった結果、解決策を示したサイトを発見。
ちゃんと理由も説明されている。そのサイトによると、

MemoryStream ms = new MemoryStream();
esponse.ContentType = "image/PNG";
bmp.Save(ms,ImageFormat.Png);
ms.WriteTo(Response.OutputStream);

こんな感じで、いったんMemoryStreamに格納してから
Responseするとうまくいくらしい。

powered by 365Boze