サーバー側(ASP.NET)では、型指定されたデータセットを用意して、DataSet.GetXml()メソッドでXMLデータを生成するのが手っ取り早い。XML DOMを利用する方法もある。
クライアント側(JavaScript)では、XMLデータのラッパークラスを用意する。XMLデータの解析にはXML DOMを使用する。
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/
拡張させることのないメンバにはvirtualキーワードを付加しないこと。
シールすることによりコンパイラが最適化してくれる。また、他者に自分の意図しない拡張をされることも防げる。(場合によっては防げないけど・・・w)
拡張させることがわかってるクラスや、拡張させる可能性が充分あるクラスは当然シールするわけにはいかないが、それ以外のクラスって大概はシールしちゃっていいと思う。
「あとで機能追加させたい時に困る」なんてのはおかしい。そのクラス自体に手を入れれば済んだりするし(つーか、それで済むならそうすべき)、本当にそのクラスを継承して拡張させたい場合もsealedキーワード取り除いてメンバを適切にvirtualにすれば済むだけの話だし。
個人的には、クラス作成時にデフォルトでsealedキーワードが書き込まれてて欲しいな。
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パターンを実装するクラスのテンプレート
発生した例外は 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
{
// 技術的な例外に対する処理
}
}