C#のnamespaceとは?名前空間を使ってクラスを階層管理しよう!

C#のnamespace(名前空間)とは?
今回は、C#のnamespaceについて説明します。
namespaceとは、日本語では名前空間と言い、関連するクラスを整理するための名前付けのスキームのことです。
パソコンのフォルダ構成で例えると、テキストファイルや画像ファイル、PDFファイルなど様々なファイルは、コンテンツごとにフォルダ分けし階層化されると管理しやすいでしょう。C#でも同じように、名前空間を使うことでクラスを階層化し管理できます。
この記事では名前空間の構文や、名前空間で階層化したクラスの使い方、命名ルールについて説明します。C#の名前空間に興味のある方はぜひご覧ください。
C#のnamespaceでクラスを階層化する方法
C#ではnamespace(名前空間)を使ってクラスを階層化できます。
簡単なプログラムでしたらソースコードの量も少なく、階層管理する必要はないかもしれません。しかしプログラムの規模が大きくなるにつれてクラスの数も比例して増えますが、クラスを関連あるものでまとめないと、クラスの管理が難しくなります。
「関連あるものでまとめる」仕組みこそが名前空間であり、そのような意味合いでもクラスを名前空間で階層化し管理しましょう。
下記は、名前空間を使って「学校」に関する様々なクラスを階層化したサンプルのソースコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
// 学校 の名前空間 namespace School { // 生徒 の名前空間 namespace Student { class Profile { // プロフィール のクラス } class Activities { // 部活 のクラス } // 科目 の名前空間 namespace Subject { class Test { // 試験 のクラス } class Rating { // 評定 のクラス } } } // 教師 の名前空間 namespace Teacher { ・・・略・・・ } } |
名前空間を定義するために「namespace」を使います。そしてnamespaceの{}で囲った中でクラスを定義することで、クラスが名前空間に属することになります。
上記の例では「学校」という名前空間の下に「生徒」という名前空間を配置しました。そして「生徒」の下に「プロフィール」と「部活」クラスが、「科目」という名前空間の下に「試験」と「評定」クラスを配置しています。
また、「学校」の下に「教師」という名前空間を「生徒」と並列して配置しました。このように名前空間で分けることで、関連ある同士でクラスをまとめることができます。
上記のソースコードは下記のように「.」を使って記述することも可能です。上記と下記で全く同じ意味になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
// 生徒 の名前空間 namespace School.Student { class Profile { // プロフィール のクラス } class Activities { // 部活 のクラス } } // 科目 の名前空間 namespace School.Student.Subject { class Test { // 試験 のクラス } class Rating { // 評定 のクラス } } // 教師 の名前空間 namespace School.Teacher { ・・・略・・・ } |
名前空間で定義したクラスを使う方法
名前空間の定義方法について説明しました。続いて、名前空間で定義したクラスを使う方法について説明します。
これまでのサンプルで紹介した、「学校」という名前空間に属するクラスを呼び出している下記のソースコードをご覧ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class Sample { static void Main() { // 生徒のプロフィールクラス School.Student.Profile pro = new School.Student.Profile(); // 生徒の部活クラス School.Student.Activities act = new School.Student.Activities(); // 生徒の科目系クラス School.Student.Subject.Test test = new School.Student.Subject.Test(); School.Student.Subject.Rating image = new School.Student.Subject.Rating(); } } |
名前空間で階層化し定義したクラスは、名前空間を「.」で繋げて呼び出しできます。しかし見てわかる通り、階層が増えるとXXX.XXX.XXX.XXX・・・のように記述が長くなってしまい、ソースコードが見づらくなってしまいます。
そこでC#では、usingディレクティブが用意されており、usingを使うことで完全修飾名(XXX.XXX.XXX.XXX・・・のようにすべての名前空間を指定する形式)を書かなくてもクラスを呼ぶことができます。
上記のソースコードについて、使用する名前空間をusingで定義してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// using で定義 using School.Student; using School.Student.Subject; class Sample { static void Main() { // 生徒のプロフィールクラス Profile pro = new Profile(); // 生徒の部活クラス Activities act = new Activities(); // 生徒の科目系クラス Test test = new Test(); Rating image = new Rating(); } } |
いかがでしょうか。このようにusingを使うことでソースコードの量を減らせ、コーディングの手間も省くことができます。
名前空間の命名ルール
続いて、名前空間の命名ルールについて説明します。Microsoftによれば、名前空間には下記のような命名ルールがあります。
・「PascalCasing」のようにパスカルケースで命名
・会社名を使用して他企業との競合を回避し、2番目にバージョンに依存しない安定した製品名を付ける
たとえば「サンプル会社」の「サンプル基幹システム」というソフトウェアの場合では、
1 2 3 |
SampleCompany.SampleCoreSystem.XXXXX.・・・.XXXX |
というように名前空間を付けます。名前空間には他のアプリケーションに存在するクラスの競合を防ぐ意味合いもあるため、そこで「会社名+製品名」と命名することでほとんどの競合を回避できます。
ただし、部署名など変わる頻度の高い組織階層は名前空間に使用しないようにしましょう(企業名は変わることが希なため、企業名を名前空間に使用することは差し支えありません)。
また、名前空間と同じクラス名は使用できず、たとえば「Sample」という名前空間の下に「Sample」というクラス名は指定できないため注意してください。
C#のnamespaceでクラスを階層管理しよう!
いかがだったでしょうか。C#のnamespace(名前空間)について説明しました。
パソコンで様々な種類のファイルをフォルダ階層で管理できるように、C#でも名前空間を用いてクラスを関連あるもの同士でまとめ、階層化できます。そして名前空間で定義したクラスを呼び出す際は、usingディレクティブを使うことで簡略化して呼び出しができます。
また、名前空間にはMicrosoftの指針で示された命名ルールがありますので、ルールを理解したうえで、他製品のアプリケーションと競合しないように命名しましょう。
プログラムの規模が大きくなるにつれ、クラスの数は比例して増えます。名前空間を上手く使いこなしてクラスを階層化し、適切に管理できるようにしましょう。