C#のnamespaceで名前を分ける理由

コンピュータ

C#では、クラスや構造体などの型をまとめるために
namespace(名前空間)という仕組みがあります。

通常はアプリケーションごとにnamespaceを決めて、そこにクラスを配置します。

namespace MyApplication
{
    class Program
    {
    }
}

また、外部ライブラリなどを使用する場合は、
usingでnamespaceを指定することで
長い名前を省略して書くことができます。

using System.Text;

StringBuilder sb = new StringBuilder();

個人的には、この程度の知識でも実用上困ることはほとんどありません。


namespaceが必要になる理由

namespaceの一番の目的は
名前の衝突を防ぐことです。

例えば、次のようなクラス名は非常に一般的です。

  • Utils
  • Helper
  • Logger
  • Config

もしnamespaceが無ければ、
異なるライブラリで同じ名前のクラスが存在した場合、
どちらを使えばよいのか分からなくなります。

LibraryA.Logger
LibraryB.Logger

このようにnamespaceがあることで、
同じクラス名でも区別して使用できます。


ソースコード再利用時の問題

個人開発でも、namespaceが重要になる場面があります。

それはソースコードを再利用するときです。

例えば、別のプロジェクトからコードをコピーした場合、
既存のnamespaceと衝突する可能性があります。

そのため、以下のような方針でnamespaceを決めると安全です。

  • 既存のnamespaceと被らない
  • プロジェクト名と被らない
  • ライブラリの所属を示す名前にする

アプリケーションをまたぐnamespace

重要な点として、
namespaceはアプリケーション単位ではありません。

つまり、別のアプリケーションで同じnamespaceを使っても問題ありません。

これは、namespaceが
コードの所属を示すラベル
のような役割を持っているためです。


ライブラリのパッケージを示す役割

実際には、namespaceは
ライブラリのパッケージ構造
を表す目的で使われることも多いです。

Maywork.Wpf.Helpers
Maywork.OpenCv.Filters
Maywork.Imaging

このようにすると、
同じnamespaceを持つコードが
「同じライブラリの一部」であることが分かりやすくなります。

その意味では、namespaceは
コードの整理とパッケージ宣言
の両方の役割を持っていると言えます。


まとめ

  • namespaceは名前の衝突を防ぐための仕組み
  • usingで省略して書くことができる
  • ソースコード再利用時の衝突を防ぐためにも重要
  • アプリケーションをまたいで同じnamespaceを使っても問題ない
  • ライブラリのパッケージ構造を表す目的でも使われる

普段はあまり意識しなくても使えますが、
ライブラリ化やコード再利用を考えると
namespaceの設計は意外と重要なポイントになります。

コメント