第2章 名前空間とクラス:連載 改訂版 C#入門(2/2 ページ)
今回は、C#プログラムの全体的な構造を知る。C#では、コードの入れ物として機能する「名前空間」と「クラス」を記述する。まずはこの2つを理解しよう。
2-3 メソッドのフルネーム
上記のサンプル・プログラムで、コンソールに文字列を出力するために、「Console
.WriteLine("Hello World!");」と記述した。すでに述べたとおり、Consoleはクラスの名前、WriteLineはメソッドの名前で、System名前空間に属していることがusingで指定されている。しかし、usingで指定する方法は唯一の方法ではない。例えば、この例の場合、Console.WriteLineのフルネームは、System.Console.WriteLineと書くことができる。usingを用いずに、このように書いても、メソッドを呼び出すことができる。
逆に、同じクラス内のメソッドを呼び出す場合には、名前空間だけでなく、クラス名も省略して書くことができる。
これらの関係を実際に体験するために、サンプルソースList 2-2を用意してみた。Visual Stduio .NETで試す場合は、前章で最初に挙げた「Hello World!」の作成手順と同じ手順でプロジェクトを作成後に、ソース・コードとしてList 2-2のテキストを入力する。もちろん行番号を入力する必要はない。
1: using System;
2:
3: namespace Namespace1
4: {
5: public class Class1
6: {
7: public static void hello()
8: {
9: Console.WriteLine("Namespace1のClass1のhello()");
10: }
11: public static void test()
12: {
13: hello();
14: Class1.hello();
15: Namespace1.Class1.hello();
16: Namespace2.Class1.hello();
17: }
18: [STAThread]
19: static void Main(string[] args)
20: {
21: Namespace1.Class1.test();
22: Namespace2.Class1.test();
23: }
24: }
25: }
26: namespace Namespace2
27: {
28: class Class1
29: {
30: public static void hello()
31: {
32: Console.WriteLine("Namespace2のClass1のhello()");
33: }
34: public static void test()
35: {
36: hello();
37: Class1.hello();
38: Namespace1.Class1.hello();
39: Namespace2.Class1.hello();
40: }
41: }
42: }
List 2-2のポイントは、2つの名前空間の中に、それぞれ同じ名前のクラス、同じ名前のメソッドが書き込まれていることである。名前空間の名前はそれぞれNamespace1とNamespace2と異なっているが、その他はみな同じである。ただ、Namespace1のクラスClass1にのみMainメソッドがあるが、Mainメソッドは最初に実行されるメソッドという条件から1プログラムに2個入れるわけにはいかないので、片方にのみ記述されている。
このプログラムで特に注目すべき点は、11行目からのtestメソッドと、34行目からのtestメソッドである。見て分かるとおり、2つのメソッドは、書かれた場所が異なる名前空間という以外、まったく同じである。その内容はというと、最初にあるtest()は、名前空間もクラスも省略したメソッド呼び出しであり、次の「Class1.hello();」は、クラスは指定しているが、名前空間は省略した書き方、残りの2つは、フルネームで記述しているが、指定する名前空間の名前が異なっている。
呼び出される側のメソッドは、7行目と、30行目に用意している。どちらが呼び出されたのかが分かるように、それぞれメッセージを出力するようになっている。
さて、実行して試す前に、ちょっとだけ考えて見ていただきたい。それぞれのメソッド呼び出しは、どちらのメソッドを呼び出すだろうか?
Mainメソッドの最後の中括弧「}」にブレークポイントを仕掛けて実行してみると、結果はFig.2-2のようになる。
この結果を要約すれば、以下のようになる。
- 同じ名前のクラスやメソッドがあった場合、何も書かずに省略すると同じ名前空間やクラスの属するものが優先的に呼び出される
- 名前空間からフルネームで指定すると、同じ名前のクラスやメソッドがあっても、それぞれきちんと呼び出すことができる
つまり、たまたま自分のプログラムの中でConsoleクラスやWriteLineメソッドを作ってしまった場合でも、フルネームでSystem.Console.WriteLineと書けば自作のメソッドではなく、間違いなくコンソール出力の機能を呼び出せるというわけである。
『新プログラミング環境 C#がわかる+使える』
本記事は、(株)技術評論社が発行する書籍『新プログラミング環境 C#がわかる+使える』から許可を得て一部分を転載したものです。
【本連載と書籍の関係について 】
この書籍は、本フォーラムで連載した「C#入門」を大幅に加筆修正し、発行されたものです。連載時はベータ版のVS.NETをベースとしていましたが、書籍ではVS.NET製品版を使ってプログラムの検証などが実施されています。技術評論社、および著者である川俣晶氏のご好意により、書籍の内容を本フォーラムの連載記事として掲載させていただけることになりました。
→技術評論社の解説ページ
ご注文はこちらから
Copyright© Digital Advantage Corp. All Rights Reserved.