全知全能を目指す人のありがたい雑記

何かしら意味のあるありがた~い話か、意味のない雑念だらけの日記を書く予定です。

【初心者向け】名前空間がよく分からない人へ

書いてる間に質問がクローズされており、悲しかったのでここに供養します。
初心者向けの内容です。C#カテゴリの質問だけど、Javaやそれ以外の言語も大体同じだと思う。

質問

c#の場合、名前空間.クラス名という構造になっていると思います
system.timerといった具合です
しかし、どうして別々の名前何でしょうか

クラス.クラス、または名前空間.名前空間でもいいんじゃないですか?
似たようなものに見えますし

回答

ディレクトリの仕組みと同じです。

ディレクトリの場合、フォルダ\ファイル名という構造になっています。
C:\Folder\File.txtといった具合です。

同名のFile.txtというファイルがあった場合、フォルダで分けないと区別がつきませんよね。

>クラス.クラス

ファイルの中に別のファイルの中身を持つことはできますが、外部からアクセスするときは面倒です。

ファイルAが別のファイルBの中身を保有しています。
ユーザーがファイルBの中身をみたいとき、ファイルAを介してファイルBの中身を見ないといけません。

それってプログラムする上で結構ノイズだし、適切なときにそういうデータの持ち方をしないと分かりづらいんです。

クラスも同じで、C#ではクラスの中にクラスを定義できます。内部クラスという機能です。ただこれも、外側のクラスを介して内部クラスを介さないといけないので、
「AというオブジェクトはBというオブジェクトを保有している」という関係にならないと、Bを内部クラスにするのは分かりづらいです。

名前空間.名前空間

これは仰る意味がよくわかりません。名前空間ってただのフォルダ名のようなものなので、その表現ではクラスを指定できませんよね。

Timerは名前だけは似ていますが、名前空間によって機能は変わってきます。

  • System.Timers.Timer
  • System.Threading.Timer
  • System.Windows.Forms.Timer
  • System.Windows.Threading.DispatcherTimer

区別をつけるために名前空間があります。

もしあなたが、「仕事のスケジュールを書く」と書かれている「TODO.txt」というファイルを開きたいときに、次のような状態だったらどう区別しますか?

フォルダTODO_LISTの構成
  • TODO.txt
  • TODO.txt
  • TODO.txt
  • TODO.txt

まあ実際は同じファイル名をつけることは出来ないんですけど。
もし同じ名前つけることができてしまったら、「仕事のスケジュールを書く」と書かれている「TODO.txt」がどれかを判別することができません。

なのでフォルダを分けてあげて区別をするんです。

フォルダTODO_LISTの構成
  • 仕事\TODO.txt ←このフォルダに「仕事のスケジュールを書く」と書かれている「TODO.txt」を入れる
  • プライベート\TODO.txt
  • 家族\TODO.txt
  • その他\TODO.txt

このようにしてあげると例え同名のファイルが存在しても、フォルダで区別できます。

C#も同じで、同じ名前空間に同じクラスはつけられません。区別がつかなくなりますから。
なので、各々別の居場所を入れ、その居場所に名前をつけて使い分けようという魂胆で名前空間という存在が生まれたのだと思います。