header

■コードの構造

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
クラスが属する空間に名前を付けることができます。
【書式】
    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();
            }
        }
    }

【実行結果】
    さいたま
    
利用する名前空間 using
名前空間はフラットで1階層な構成ではなく 使いたいクラスなどは何階層か潜ることになります。 そのたびに目的のクラスを宣言するために System.なんとか.かんとか.もっと.まだまだ.クラス名 などと記述していたのではコードが冗長になります。 これが数箇所ならば忍耐も続くのですが 良く利用する階層の名前空間を ソースコードの先頭にてあらかじめ宣言しておけば 手早く目的のクラス名を記述することができます。 この時に使うキーワードが using です。 具体的な例を示します。 まず、次のような名前空間内にクラスが宣言されているとします。
【深い階層に宣言されたクラスの例】
    namespace System
    {
        namespace なんとか
        {
            namespace かんとか
            {
                namespace もっと
                {
                    namespace まだまだ
                    {
                        class クラス名
                        {
                        }
                    }
                }
            }
        }
    }
このクラスをusingを使わずにnewすると System.なんとか.かんとか.もっと.まだまだ.クラス名 変数名 = new System.なんとか.かんとか.もっと.まだまだ.クラス名(); となり、かなり見辛いです。 これをusingを使って using System.なんとか.かんとか.もっと.まだまだ; と前もって宣言しておくと クラス名 変数名 = クラス名(); のように簡潔に目的のクラスを利用することができます。




Copyright © 2008.07 - shougo suzaki