C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2006/07/29 19:24
単一の値を取得するとか、単純な複数の値を取得するだけなら前回の記事に記載した3つ目のリンク先のやり方で実現できるけど、例えば要素数が不定の配列を複 数取得とか、複雑な構造のオブジェクトを取得するとなるとリンク先のやり方じゃきつい。そういう場合はXMLデータで受け渡しすればいい。
サーバー側(ASP.NET)では、型指定されたデータセットを用意して、DataSet.GetXml()メソッドでXMLデータを生成するのが手っ取り早い。XML DOMを利用する方法もある。
クライアント側(JavaScript)では、XMLデータのラッパークラスを用意する。XMLデータの解析にはXML DOMを使用する。
2006/07/29 12:33
ASP.NET 2.0ではクライアント コールバックという技術により、クライアント ・サーバー間で簡単に非同期通信(クライアント側でページをリロードすることなく、サーバーのコードを実行し結果を受け取ること)を行えるようになった。

ASP.NET Web ページでポストバックせずにクライアント コールバックを実装する
http://msdn2.microsoft.com/ja-jp/library/ms178208.aspx
ページをリロードせずにサーバーとやり取りする方法
http://www.microsoft.com/japan/msdn/asp.net/tips/ClientCallback/
クライアント・コールバックで複数の値をクライアントへ渡す方法
http://www.microsoft.com/japan/msdn/asp.net/tips/ClientCallback2/
2006/07/24 19:46
拡張させることのないクラスにはsealedキーワードを付加してシールクラスとすること。
拡張させることのないメンバにはvirtualキーワードを付加しないこと。
シールすることによりコンパイラが最適化してくれる。また、他者に自分の意図しない拡張をされることも防げる。(場合によっては防げないけど・・・w)

拡張させることがわかってるクラスや、拡張させる可能性が充分あるクラスは当然シールするわけにはいかないが、それ以外のクラスって大概はシールしちゃっていいと思う。
「あとで機能追加させたい時に困る」なんてのはおかしい。そのクラス自体に手を入れれば済んだりするし(つーか、それで済むならそうすべき)、本当にそのクラスを継承して拡張させたい場合もsealedキーワード取り除いてメンバを適切にvirtualにすれば済むだけの話だし。

個人的には、クラス作成時にデフォルトでsealedキーワードが書き込まれてて欲しいな。
2006/07/23 16:37
クラスがアンマネージリソースをフィールドに保持する場合、またはIDisposableインターフェイスを実装するクラスをフィールドに保持する場合、そのクラスはIDisposableインターフェイスを実装する必要がある。
IDisposableを実装する際は以下の要件を満たすために、Dispose Finalizeパターンを適用する。


  • Dispose()はマネージリソースとアンマネージリソースの解放処理を行う。

  • デストラクタはアンマネージリソースの解放処理を行う。

  • Dispose()が呼び出された場合、デストラクタがGCによって呼び出されることのないようにする。

  • Dispose()は複数回呼び出されても良いようにする。

  • Dispose()、デストラクタでは、例外がスローされないようにする。

  • Dispose()が呼び出された後にDispose()以外のパブリックメソッドを呼び出すとObjectDisposedExceptionがスローされるようにする。


Dispose Finalize パターンpublic class Class1 : IDisposable
{
    private bool disposed;

    public Class1()
    {
        this.disposed = false;
    }

    public void Dispose()
    {
        GC.SuppressFinalize(this);
        this.Dispose(true);
    }

    ~Class1()
    {
        this.Dispose(false);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (this.disposed)
        {
            return;
        }
        this.disposed = true;
        if (disposing)
        {
            // マネージリソースの解放処理
        }
        // アンマネージリソースの解放処理
    }

    public void Method1()
    {
        this.ThrowExceptionIfDisposed();
        // Method1の処理
    }

    protected void ThrowExceptionIfDisposed()
    {
        if (this.disposed)
        {
            throw new ObjectDisposedException(this.GetType().ToString());
        }
    }
}

void Dispose(bool disposing)メソッドは、クラスがシールドクラスでない場合は上記のようにプロテクトな仮想メソッドとし、クラスがシールドクラスである場合はプライベートなメソッドとする。

// 追記
ThrowExceptionIfDisposed()メソッドはDispose Finalizeパターンに含まれていないが、このメソッドをプロテクトメソッドとして用意することにより、派生クラスで定義したメソッドでも Dispose済みかどうかを簡単に調べる(というかObjectDisposedExceptionをスローする)ことができる。

// 追追記
Dispose Finalizeパターンを実装するクラスのテンプレートを作成しました。このテンプレートを使えば、Dispose Finalizeパターンを簡単に実装できます。

Dispose Finalizeパターンを実装するクラスのテンプレート
2006/07/22 18:58
ASP.NETでは、ハンドルされなかった例外はGlobal.asaxのApplication_Error(HttpAplication.Errorイベントのハンドラ)で処理できる。
発生した例外は this.Server.GetLastError()で取得できるのだが、例外は基本的にHttpUnhandledExceptionにラップされている(必ずではない)ので注意する必要がある。
例外を処理したら this.Server.ClearError()でクリアすること。ただし、Web.configのcustomErrorsセクションに設定したエラー処理方法を適用させたい場合はクリアしない。

Global.asax void Application_Error(object sender, EventArgs e)
{
    Exception ex =
        this.Server.GetLastError() is HttpUnhandledException ?
        this.Server.GetLastError().InnerException :
        this.Server.GetLastError();
    this.Server.ClearError();
    if (ex is ApplicationException)
    {
        // 業務上の例外に対する処理
    }
    else
    {
        // 技術的な例外に対する処理
    }
}

また、ページ単位で例外ハンドラを用意することもできる。
この場合はPage_Error(TemplateControl.Errorイベントのハンドラ)で処理する。
Global.asaxのApplication_Errorとは違い、GetLastError()で取得できる例外はハンドルされなかった例外そのものである。

Hoge.aspx.cs protected void Page_Error(Object sender, EventArgs e)
{
    Exception ex = this.Server.GetLastError();
    this.Server.ClearError();
    if (ex is ApplicationException)
    {
        // 業務上の例外に対する処理
    }
    else
    {
        // 技術的な例外に対する処理
    }
}
タグ: C# .NET ASP.NET 例外処理