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の設計は意外と重要なポイントになります。

コメント