はじめてのC#
文字の出力
まず、C# 言語での開発はこれまでのプログラミング言語同様にソースを記述します。ソースプログラムは、メモ帳などのテキストエディタで C# を記述しこれを *.cs という拡張子で保存します。一般に C# 言語のソースコードの拡張子は cs です。ここでは、C# プログラムを実際に記述しコンパイルして実行する過程を説明します。
C# では、全てのコードはクラス(class)と呼ばれる枠組の中で動作します。そのためには、まずクラスを作成しなければなりません。
C# において、プログラムの構成要素を定義することを宣言(Declarations)と呼びます。クラスを作成するには、クラスを宣言します。厳密ではありませんが、この場では単純に次のような形でクラスを宣言すると覚えてかまいません。
class クラス名 { クラス本体 }
冒頭の class という部分は、そのままソースコード上に class と打ち込みます。これは、C# の言語仕様でクラスを宣言することを表すために定められた単語です。このような、プログラミング言語の使用で事前に意味が決められている英単語をキーワード(Keyword)と呼びます。
クラス名には、このクラスの名前を指定します。このクラス名のように、プログラムコード内で作成した何らかの要素を識別するために使われる名前のことを識別子(Identifiers)と呼びます。識別子は、プログラム内で後から対象の要素にアクセスするときに必要になります。今は使いませんが、外部のコードなどからクラスを利用するときに、宣言したクラス名を利用します。
識別子の名前は、伝統的な C 言語の命名規則に基本的に従って付けることができます。識別子の最初の文字はアンダースコア ( _ )またはアルファベットです。さらに C# は @ 文字が最初のプリフィックスとして用いることも許されています。最初の文字以降では、アルファベット以外に数値などを指定することもできます。
クラスの本体は { ではじまり } で終わります。クラス本体は省略することも可能です。ここまでが 1 つのクラスです。
class Test { }
上記は本体を含まないシンプルなクラスの宣言です。クラスの名前は Test としていますが、この部分は任意の名前に変更できます。Sample クラスでも Hoge クラスでも WorldIsAllOne クラスでも大丈夫です。ただし、実践ではクラスの役割を表す意味のある名前を付けてください。
C# プログラムは Main() というメソッド(Method)から開始されます。メソッドについては、後ほどクラスと一緒に詳しく説明します。この場では、クラスに関連付けられた、そのクラスの「動作」を定義したプログラムの集合のことだと理解してください。C# では、このメソッドの中にプログラムの動作を記述するのです。
Main() メソッドは、C言語の main() 関数に相当するメソッドです。C# は C 言語同様に大文字と小文字を区別するので注意してください。C# のエントリポイント(プログラム開始位置)は main() ではなく Main() です。
static void Main()
static や void というキーワードがありますが、これらの意味は今は重要ではありません。クラスやメソッドについて詳しく説明する時に、これらの詳細について説明します。今は、この Main() メソッドからプログラムが開始されるということを理解してください。メソッドもクラス同様に、本体は { から始まり } で終わります。
class Test { static void Main() { } }
これが最小の C# プログラムです。Test クラスの Main() メソッドが実行されますが、Main() メソッドの本体は何も書かれていないため、このプログラムは何をすることもなく即座に終了してしまいます。
このソースをコンパイルするには、エディタで書いたソースを保存し、コンパイラでコンパイルします。Microsoft .NET Framework SDK なら csc.exe を使ってコンパイルできます。
csc ファイル名
パラメータの「ファイル名」にはコンパイルするソースコードを指定してください。これを、コンソールから実行してコンパイルすると実行ファイルが出力されます。
次は、コンソールプログラムの基本である文字列の出力に挑戦しましょう。コンソールに文字列を表示するには
System.Console.WriteLine("出力する文字列")
と記述します。この意味も、今後詳しく C# の仕様を学ぶことで知ることができるでしょう。WriteLine() はメソッド、Console は WriteLine() メソッドを定義しているクラスです。これらの機能は C# ではなく、.NET Framework Class Library が提供しているものであり .NET 開発環境であれば C++ や Visual Basic .NET などからアクセスすることも可能です。
メソッドには、パラメータと呼ばれるデータを渡すことができます。パラメータはメソッドの ( ) の中に記述します。どのようなパラメータを渡すかは、そのメソッドが何を要求しているかで決まります。WriteLine() メソッドは、数値、文字、文字列、浮動小数点数など、様々なものを渡せます。
文字列は、必ず二重引用符 " で囲みます。WriteLine("好きな文字") とすれば文字列をコンソールに出力できます。また、C# は 1 つの命令の終端をセミコロン ; で指定する必要があります。この仕様は C/C++ 経験者であれば、もはやお馴染みのものだと思います。
class Test { static void Main() { System.Console.WriteLine("Kitty on your lap"); } }
このプログラムをコンパイルして実行すると、コンソールに Kitty on your lap という文字列が表示されます。また、WriteLine() メソッドは文字の出力後に改行を自動的に付加します。
ところで、このプログラムは機械語ではなく CIL、すなわち中間言語にコンパイルされます。 普段はそれが何なのかを気にする必要はありませんが、少し除いてみましょう。.NET Framework SDK は、ILDASM.EXE という逆アセンブルツールを含んでいます。このアプリケーションで .NET 実行ファイルを開くと CIL を直接見ることができます。
.method private hidebysig static void Main() cil managed { .entrypoint // Code size 11 (0xb) .maxstack 8 IL_0000: ldstr "Kitty on your lap" IL_0005: call void [mscorlib]System.Console::WriteLine(string) IL_000a: ret } // end of method Test::Main
この場は C# 言語の解説が目的なので、中間言語の詳細な説明をすることはしませんが、これは先ほどの C# プログラムをコンパイルした CIL の言語そのものです。アセンブリ経験者であれば、ldstr でスタックに文字列をプッシュし、WriteLine() メソッドが呼び出され、その後 ret によって制御を戻していることがわかるでしょう。