プログラフは変数を使います。
変数は適切なスコープで使いましょうとよくいわれます。
そもそも大きくわけて古い言語は
- 局所スコープ
- 関数スコープ
- アプリケーションスコープ
というスコープを持っています。(局所スコープを持っていない言語もあります)
たとえばC系で言うとこういう構文
int CheckNo(char* abc)
{
int i;
{
int j;
j++;
i = j;
}
//もはやjはいない
return ( i );
}
ただいろいろな関数があってそのすべてで持ちまわらないといけない値があったとします。
これを持ちまわる場合にめんどくさいからといってアプリケーションスコープの変数を使うのは考えものです。
アプリケーションスコープにするとどこからでも参照、更新が可能になります。
ここにはこの値が入っているはずといっても設定しないルートが追加になるともはやその値の保証は無くなります。
アプリケーションのスコープが必要な場合には十分な設計をしましょう。
ただ明示的に開放が必要なもの等をすべてきちんと管理するのは至難の技ですが。
望ましいのはアプリケーションの起動時に必要な情報を集めておくとかそう言ったもののみに限定する方がいいと思いますよ。
こうなると関数に閉じないが、共有したい変数をどう扱うかが問題になります。
#それに対する回答がクラスなんですが・・・
それででてくるのがクラススコープです。
- 局所スコープ
- 関数スコープ
- クラススコープ
- アプリケーションスコープ
クラスにスコープを持つということと、明示的に開放しないといけないものが現存しているという事実からして、終了処理はきわめて大事です。
C++においてはデストラクタ(~ClassName())
VB6ではClass_Terminate
.NetではIDisposable.Disposeに終了処理を持つことが推奨されています。
(C#ではさらにデストラクタでもDisposeを呼ぶように推奨)
(VB.NetではFinalizeでもDisposeを呼ぶように推奨)
クラスのコンストラクタ(イニシャライザ)と破棄処理(ディスポーザ、ファイナライザ)では明確なポリシーの無い限りは例外を出すべきではないとされています。そう言った設計をこころがけましょう。 #もちろんDisposeは何回呼ばれても安全です。C++のdeleteもNULLにたいして deleteしても安全です。 Disposeは原理的にインスタンスのメソッドですので
try
{
SqlConnection con = new SqlConnection();
SqlCommand com = new SqlCommand();
}
finaly
{
com.Dispose();
con.Dispose();
}
こう言った構文を書きがちですが2つ問題があります。
conやcomはtryのスコープ内にいてるのでfinallyしたい時にはすでにおらない。
conやcomのインスタンスがいるとは限らない。
SqlConnection con;
SqlCommand com;
try
{
con = new SqlConnection();
com = new SqlCommand();
}
finaly
{
if ( com != null )
{
com.Dispose();
}
if ( con != null )
{
con.Dispose();
}
}
何が書きたかったのか忘れちゃいましたが、.NetとC#の組み合わせはとてもパワフルで、とても安全なコードを記述する事に対して全力でサポートしてくれます。
適切なコードはリークや、不要メモリアクセス等の考慮が不要になります。
ぜひみなさんもC#に手を染めてください(^^
最後にC#のusingステートメントを利用した例を記載します。
using ( SqlConnection con = new SqlConnection())
using ( SqlCommand com = new SqlCommand())
{
}