C#のソースコードの構成についてまとめます。
前節で
C#のコンソールアプリケーションプロジェクトを新規に作成しました。
その時、雛形コードが作成されました。
これにさらに
・クラスのメンバ変数
・関数のローカル変数
を追記すると下記のようなコードになります。
【C#ソースコードの雛形】
using System;
using System.Collections.Generic;
using System.Text;
namespace Hello
{
class Program
{
// クラスのメンバ変数
private int m_value;
static void Main(string[] args)
{
// 関数のローカル変数
int value;
}
}
}
これを図で説明すると次のようになります。
【図説】
利用する名前空間列挙 using
名前空間 namespace
+----------------------------------------------------------+
| |
| クラス class |
| +--------------------------------------------------+ |
| | メンバ変数...クラス内のメソッド内で利用可能 | |
| | | |
| | メソッド | |
| | +------------------------------------------+ | |
| | | | | |
| | | ローカル変数...メソッド内でのみ利用可能 | | |
| | | | | |
| | +------------------------------------------+ | |
| | | |
| +--------------------------------------------------+ |
| |
+----------------------------------------------------------+
上から順に説明していくと
【1.名前空間列挙】
ソースコードの先頭位置で
利用する名前空間が列挙されています。
using System;
using System.Collections.Generic;
using System.Text;
こうすることで、このソースコード内で
列挙した名前空間に属する機能を利用可能になります。
【2.名前空間定義】
定義するクラスが属する空間名を記述し、
{}でクラスをすっぽりと囲います。
namespace Hello
{
ここでクラス定義
}
【3.クラス定義】
データと、それを処理するメソッド(関数)の塊を
クラスとして定義します。
class Program
{
メンバ変数定義したり
メソッドを定義したり
}
以上がおおまかなソースコードの構成です。
名前空間、クラス、メソッド、
それぞれについては、この後別途説明します。
クラスが属する空間に名前を付けることができます。
【書式】
namespace 空間名
{
中略
}
この機能のおかげで
沢山あるユーザ定義のクラスや
.NET Frameworkのクラスを
その機能ごとにカテゴリー分けすることができます。
また、名前空間を利用するメリットとして
衝突を予防することができます。
例えば、
ある人がファイルの読み書きを行う機能を持った
fileクラスを作ったとします。
そして後から別の人が
同じ名前のfileクラスを作ったとします。
当然、同名のクラスを定義することはできませんから
ここで衝突が起こります。
しかし、名前空間を使って住み分けをすることによって
次のように同名のクラスを定義することができます。
namespace yamada
{
class file
{
}
}
namespace tanaka
{
class file
{
}
}
それぞれのfileクラスを利用する場合は
yamada.file
或いは
tanaka.file
のように、頭に名前空間名をつけて
どの名前空間に属するクラスを利用するのかをはっきりさせます。
または、後述するusingを使って
利用する名前空間を指定します。
【名前空間のネスト】
名前空間はネスト(入れ子)させることができます。
namespace a
{
namespace b
{
class c
{
}
}
}
この場合、クラスcを利用する際には
a.b.c
のように、外側の名前空間から順に記述して
最後に目的のクラス名に辿り着けます。
【Sampleコード】
using System;
namespace World
{
namespace Japan
{
class Saitama
{
public void PutName()
{
Console.WriteLine("さいたま");
}
}
}
}
namespace Sample
{
class Class1
{
static void Main(string[] args)
{
World.Japan.Saitama sai = new World.Japan.Saitama();
sai.PutName();
}
}
}
【実行結果】
さいたま
名前空間はフラットで1階層な構成ではなく
使いたいクラスなどは何階層か潜ることになります。
そのたびに目的のクラスを宣言するために
System.なんとか.かんとか.もっと.まだまだ.クラス名
などと記述していたのではコードが冗長になります。
これが数箇所ならば忍耐も続くのですが
良く利用する階層の名前空間を
ソースコードの先頭にてあらかじめ宣言しておけば
手早く目的のクラス名を記述することができます。
この時に使うキーワードが using です。
具体的な例を示します。
まず、次のような名前空間内にクラスが宣言されているとします。
【深い階層に宣言されたクラスの例】
namespace System
{
namespace なんとか
{
namespace かんとか
{
namespace もっと
{
namespace まだまだ
{
class クラス名
{
}
}
}
}
}
}
このクラスをusingを使わずにnewすると
System.なんとか.かんとか.もっと.まだまだ.クラス名 変数名 =
new System.なんとか.かんとか.もっと.まだまだ.クラス名();
となり、かなり見辛いです。
これをusingを使って
using System.なんとか.かんとか.もっと.まだまだ;
と前もって宣言しておくと
クラス名 変数名 = クラス名();
のように簡潔に目的のクラスを利用することができます。