中の技術日誌ブログ

C#とC++/CLIと
VBと.NETとWindowsで戯れる
 

目次

Blog 利用状況

ニュース

自己紹介

東京でソフトウェアエンジニアをやっています。
お仕事大募集中です。
記事執筆や、講師依頼とかでも何でもどうぞ(*^_^*)
似顔絵 MSMVPロゴ
MSMVP Visual C# Since 2004/04-2013/03

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

変数スコープと変数の廃棄

プログラフは変数を使います。
変数は適切なスコープで使いましょうとよくいわれます。

そもそも大きくわけて古い言語は

  • 局所スコープ
  • 関数スコープ
  • アプリケーションスコープ

というスコープを持っています。(局所スコープを持っていない言語もあります)

たとえば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())
{
}

投稿日時 : 2004年6月5日 16:16

コメントを追加

No comments posted yet.
タイトル
名前
URL
コメント