うに.log

作業した内容のまとめとか読んだ本のまとめとか。間違っていることがあったらツッコミとかがもらえるといいなぁという願望のもと、とりあえずやったこと、調べたこと、理解していることしていないことをだらだら書いていく。勉強用のブログ。

C# - 名前空間について

一気に複数書こうと思ったけどボリューム的に厳しいので名前空間だけ。

名前空間

えっ、これ 1.x 系では無かったんだ!?ってなるくらい今では当たり前の言語機能。

これは 2.0 から使えるようになりました。

何ができるのか

名前空間を使うことで、クラスや構造体を階層化して整理することができます。

階層構造で一番よく目にするのはフォルダ構造かと思います。

技術書
├ インフラ
│ ├ Windows
│ │ ├ …
│ ├ Linux
│ …
├ プログラミング
│ ├ サーバー
│ ├ クライアント
…
…

こんなイメージ。適切にカテゴライズすることで情報への到達を容易にできるようにする手段です。

namespace UniNamespace { class Uni { } } の形式で記述することで利用できます。

名前空間を定義することで、クラスや構造体の整理ができるのはもちろんそうなのですが、
他にも他人が作ったものとの重複を避けられることも大きなメリットになります。

名前空間を分けずに定義した場合、他人が作ったクラスを利用したいとなった時に面倒なことになったりします。

初期のUnityなんかはそもそも名前空間のサポートをしなかったりしていたので割と困った子だったようです。*1

使い方

そんな名前空間ですが、以下のように二種類の階層化方法があります。

namespace ParentNamespace
{
    namespace ChildNamespace
    {
        public class Hoge { }
    }
}
namespace ParentNamespace.ChildNamespace
{
    public class Hoge { }
}

が、可読性の問題もあるので基本的に後者しか見ないと思います。

少なくとも私はこれまで前者の記述方法を実プロダクトで見たことはありません。

名前空間に定義されたクラスの呼び出し方はいくつかあります。

一つ目は名前空間using で宣言して使う方法。

using ParentNamespace.ChildNamespace;

namespace TekitouNamespace
{
    public class Foo
    {
        Hoge hoge = new Hoge();
    }
}

二つ目は名前空間を含めたフルネーム(完全就職名)で呼び出す方法。

namespace TekitouNamespace
{
    public class Foo
    {
        ParentNamespace.ChildNamespace.Hoge hoge = new ParentNamespace.ChildNamespace.Hoge();
    }
}

三つ目は同じ名前空間に属した状態で処理を記述する方法。

namespace ParentNamespace.ChildNamespace
{
    public class Foo
    {
        Hoge hoge = new Hoge();
    }
}

四つ目、これはちょっと番外編になりますが、エイリアスを使ってクラスに別名をつける方法。

using Hage = ParentNamespace.ChildNamespace.Hoge;
namespace TekitouNamespace
{
    public class Foo
    {
        Hage hage = new Hage();
    }
}

四つ目の方法は別の名前空間内に同一名称のクラスが存在している場合や長大な名前のクラスやインターフェイスを省略したりとかいう場合に使われます。

*1:async/await ができるようになった時も最初は名前空間のサポートを忘れるくらい名前空間に対する扱いがひどい