連載C#入門第2回 ネームスペースとクラス(株)ピーデー川俣 晶 2001/03/15 |
メソッドのフルネーム
上記のサンプル・プログラムで、コンソールに文字列を出力するために、“Console.WriteLine("Hello World!");”と記述した。すでに述べたとおり、“Console”はクラスの名前、“WriteLine”はメソッドの名前で、Systemネームスペースに属していることが暗黙のうちに指定されている。しかし、暗黙で指定するだけでなく、明示的に指定することもできる。例えば、この例の場合、“Console.WriteLine”のフルネームは、“System.Console.WriteLine”と書くことができる。このように書いても、メソッドを呼び出すことができる。
逆に、同じクラス内のメソッドを呼び出す場合には、ネームスペースだけでなく、クラスも省略して書くことができる。
これらの関係を実際に体験するために、以下のようなサンプルソースを用意してみた。Visual Stduio.NETで試す場合は、前回のHello World!(もちろん、1番目の方のサンプル)の作成手順と同じ手順でプロジェクトを作成後に、ソースコードとして以下のテキストを入力する。もちろん行番号を入力する必要はない。このリストの表示をコピー&ペーストする場合は行番号を削除していただきたい。
|
|
ネームスペースの働きを調べるサンプルプログラム | |
このnamespaceプログラムのソースコードを含むプロジェクトファイルはこちら。 namespace.zip(6Kbytes) |
このサンプルソースのミソは、2つのネームスペースのなかに、それぞれ同じ名前のクラス、同じ名前のメソッドが書き込まれていることである。ネームスペースの名前はそれぞれ“Namespace1”と“Namespace2”と異なっているが、その他はみな同じである。ただ、“Namespace1”のクラス“Class1”にのみ“Main”メソッドがあるが、“Main”メソッドは最初に実行されるメソッドという条件から1プログラムに2個入れるわけには行かないので、片方にのみ記述されている。
さて、このプログラムで特に注目すべき点は11行目からの“test”メソッドと、34行目からの“test”メソッドである。見て分かるとおり、2つのメソッドは、書かれた場所が異なるネームスペースという以外、まったく同じである。その内容はというと、最初にある“test()”は、ネームスペースもクラスも省略したメソッド呼び出し。次の“Class1.hello();”は、クラスは指定しているが、ネームスペースは省略した書き方。残りの2つは、フルネームで記述しているが、指定するネームスペースの名前が異なっている。
呼び出される側のメソッドは、7行目と、30行目に用意している。どちらが呼び出されたのかが分かるように、それぞれメッセージを出力するようになっている。なお、これらのメソッド宣言で使われている“void”は、値を返さないメソッドであることを示すキーワードである。
さて、実行して試す前に、ちょっとだけ考えて見ていただきたい。それぞれのメソッド呼び出しは、どちらのメソッドを呼び出すだろうか?
Visual Studio.NETで“return 0;”の行にブレークポイントを仕掛けて実行してみると、結果は以下のようになる。
上のプログラムを実行したところ |
前出のサンプルソースをVisual Studio.NETで実行した結果。前回説明したとおり、何もしないで実行すると、実行終了とともにウィンドウが消去されてしまい、結果を確認できないので、“Main”メソッドの最後にある“return 0;”の行にブレーク・ポイントを設定している。 |
この結果を要約すれば、同じ名前のクラスやメソッドがあった場合、何も書かずに省略すると、同じネームスペースやクラスの属するものが優先的に呼び出されるが、ネームスペースからフルネームで指定すると、同じ名前のクラスやメソッドがあっても、それぞれをきちんと呼び出すことができる、ということになる。
つまり、たまたま自分のプログラムのなかでConsoleクラスやWriteLineメソッドを作ってしまった場合でも、フルネームで“System.Console.WriteLine”と書けば自作のメソッドではなく、間違いなくコンソール出力の機能を呼び出せると言うわけである。
まとめ
ネームスペースやクラスによってメソッドを細かく分離していく手法は、プログラムの規模が大きいときに非常に役に立つ。混乱を解決し、物事を分かりやすく整理する効果がある。しかし、小さいプログラムしか書かない場合でも、利用できるクラス・ライブラリは膨大である。それをうまくかき分けて利用するために、ネームスペースやクラスの機能は非常に有益である。
だが、クラスの持つ機能は、単なるメソッドの分類だけではない。次回は、オブジェクト指向的にクラスを活用する方法を解説しよう。C#はオブジェクト指向の基本を知っていなければ使いこなせない言語である。オブジェクト指向を知らない読者はぜひこの機会に、魅惑のオブジェクト指向(?)の世界に足を踏み入れてほしい。オブジェクト指向をよく知っている読者には退屈かもしれないが、実はC#はオブジェクト指向と言うよりもコンポーネント指向と呼ばれており、古いオブジェクト指向とはやや傾向が異なっている面もある。その種の話題にも触れていきたいと考えている。
INDEX | ||
C#入門 第2回 ネームスペースとクラス | ||
1.C#プログラムの構造 | ||
2.Hello Worldの仕組み | ||
3. メソッドのフルネーム | ||
「C#入門」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|