第2章 名前空間とクラス:連載 改訂版 C#入門(1/2 ページ)
今回は、C#プログラムの全体的な構造を知る。C#では、コードの入れ物として機能する「名前空間」と「クラス」を記述する。まずはこの2つを理解しよう。
本記事は、(株)技術評論社が発行する書籍『新プログラミング環境 C#がわかる+使える』から許可を得て転載したものです。同書籍に関する詳しい情報については、本記事の最後に掲載しています。
これから、サンプル・プログラムのソース・コードをお見せしながらC#のさまざまな機能を解説していく。そのソース・コードには、最低限、プログラムの入れ物として機能する「名前空間」と「クラス」と呼ばれる記述をする必要がある。そこで、ほかのすべての説明に先立って、この2つに関して簡単に説明をしておく。
2-1 C#プログラムの構造
まず最初に、C#プログラムの全体的な構造について説明しよう。C#では名前空間やクラスという大きな構造があり、必要な機能を呼び出すためには、これを理解することがどうしても必要になる。クラスのような機能を意識する必要のないプログラミング言語を使っていた方々には面倒なことに思えるかもしれないが、無意味に面倒を増やすために、このような機能があるわけではないことはもちろんである。存在することにはそれなりの理由がある。また、使いこなすことによってメリットも生じる。
大まかにいうと、C#プログラムはFig.2-1のような構造になる。
つまり、名前空間(ネームスペース)という大きな箱があり、その中にクラスが入る。クラスの中には、メソッドと変数を入れることができる。メソッドの中にも変数を持つことができる。メソッドとは、C言語でいえば関数、BASICなら手続きや関数に相当するもので、この中に実行するプログラムの実体を書き込むことになる。クラスとは、オブジェクト指向でいうクラスである。詳しいことは後で述べるが、いまは、メソッドや変数の入れ物として機能すると思っていただきたい。名前空間というのは、オブジェクト指向を扱うプログラミング言語の経験者でも耳慣れない用語かもしれない。C++などの既存の言語でも名前空間の機能を持つ場合もあるが、使わないことも多いためだ。だが、C#では名前空間を意識的に活用する必要が生じる。
能書きはさておき、実際にこの構造がどのように記述され、機能するかを見てみよう。
2-2 「Hello World!」の仕組み
まず最初に、前章のプログラムがどういう仕組みになっているかを説明しよう。前章のプログラムのソース・コードはList 2-1のような内容であった。
1: using System;
2:
3: namespace ConsoleApplication1
4: {
5: /// <summary>
6: /// Class1 の概要の説明です。
7: /// </summary>
8: class Class1
9: {
10: /// <summary>
11: /// アプリケーションのメイン エントリ ポイントです。
12: /// </summary>
13: [STAThread]
14: static void Main(string[] args)
15: {
16: Console.WriteLine("Hello World!");
17: }
18: }
19: }
まず、3行目のnamespaceというキーワードに注目していただきたい。これは名前空間を宣言するキーワードである。ここでは、ConsoleApplication1という名前の名前空間を宣言している。そして、名前空間ConsoleApplication1の範囲はというと、その後の中括弧({})で囲まれた範囲ということになる。つまり4行目の開き中括弧から、19行目の閉じ中括弧までが、名前空間ConsoleApplication1に属するというわけである。
次に8行目を注目していただきたい。この行のclassというキーワードがクラスを宣言している。ここではClass1という名前のクラスを宣言している。クラスの範囲は、名前空間と同様、その後ろの中括弧が決める。つまり、クラスClass1の範囲は9行目から18行目までである。
次に14行目を見ていただきたい。これが、メソッドの宣言である。この1行は、プログラムの実行が始まったとき、最初に実行されるメソッドを宣言する、いわばお約束の行である。メソッドを宣言するにあたって、namespaceやclassのようにメソッドであることを示すキーワードは特に存在しない。ごく大ざっぱにいえば、名前の後ろに括弧を付けた宣言はメソッドの宣言と解釈される。ここでは、Mainがメソッドの名前で、その後ろにある括弧がMainがメソッドであることを示している。括弧の内部はメソッドの引数だが、List 2-1では参照されていないので、読み飛ばしていただきたい。Mainの手前には「static void」というキーワードが並んでいるが、それぞれ意味がある。staticとはオブジェクトを生成しなくても呼び出し可能であることを示すが、これはオブジェクト指向とも関係することなので、後の章で詳しく説明する。ここでは、メソッドにはstaticを付けると思っておいてほしい。voidは、値を返さないことを示す。Visual BasicでいうとFunctionではなくSubを宣言することに相当するものである。メソッドの内容は、名前空間やクラスなどと同じく、後続の中括弧の範囲である。ここでは15行目から17行目までがそれに該当する。
さて、ここまでは、名前空間やクラスやメソッドを宣言する構文であった。ここからは、逆に、すでにある名前空間やクラスやメソッドを利用する構文に関する話になる。16行目の「Console.WriteLine("Hello World!");」という部分は、ConsoleというクラスのWriteLineというメソッドを呼び出す機能を記述している。このメソッドはコンソールに引数の文字列を表示するという機能を持つ。だが、ここで、「おや?」と思わないだろうか? このソース・コードの中には、ConsoleというクラスもWriteLineというメソッドも宣言されていない。実は、このクラスは、Systemという名前空間の中に存在する。System名前空間は、標準のクラス・ライブラリの中に含まれているもので、必ずあるものと仮定して利用することができる。しかし、クラス・ライブラリには多数の名前空間があり、その中には同じ名前のクラスが複数存在する場合もある。C#では、名前空間を指定せずに、クラスを利用することはできないことになっている。
具体的に名前空間を指定する方法は複数ある。この例で使用しているのは、usingというキーワードを使って利用する名前空間を記述する方法である。List 2-1の1行目を見ていただきたい。usingは、指定された名前空間のクラスを、単にクラス名を書くだけで利用可能にする効能がある。ここではSystemというキーワードを続けて記述することで、System名前空間のクラスをソース内に直接記述可能にしている。そして、終わりの印として最後にセミコロン(;)記号を必ず書き込む。usingはすべての中括弧の外側に記述されているため、ソース・コード全体に作用する。当然、16行目の「Console.WriteLine("Hello World!");」はその範囲内なので、usingの指定が作用する。Consoleクラスはここには宣言されていないので、using指定されたSystem名前空間と仮定して処理されるのである。
この手順は、便利なクラスの宝庫であるクラス・ライブラリを活用する際に知っておく必要がある。よく頭に入れておこう。ただ単にクラス名を書いて利用したいなら、usingを活用しなければならない。
2文字のスラッシュ記号(//)が記述された場合は、それ以後行の終わりまでコメントと見なされる。このサンプルソースでは、3文字のスラッシュ(///)が使用されているが、これはドキュメントをソースに埋め込む構文である。ここでは、ただコメントだと理解して読んでいただきたい。
最後に13行目の[STAThread]だが、これはマルチ・スレッドに関する設定として機能する。本連載ではマルチ・スレッドの詳しい機能には踏み込まないので、これは自動的にMainメソッドの手前に生成されるものだと思って、そのままにしておいていただきたい。
Copyright© Digital Advantage Corp. All Rights Reserved.