C#プログラム解説
今回は前回VisualStudioで作ったC#プログラムの解説です。
C#プログラムコード
まずは、前回作ったC#プログラムファイルの中身を見てみましょう。
ちなみに、C#ファイルが書かれているファイルのことをソースファイル、プログラムコードのことをソースコードと言ったりもします。
それでは早速前回のソースコードから見ていきましょう。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Sample { internal class Program { static void Main(string[] args) { Console.Write("HelloWorld."); Console.ReadLine(); } } }
このプログラムを実行すると、以下のような画面が表示されます。
「HelloWorld.」と表示され、Enterキーを押すとプログラムが終了します。
C#プログラム解説
それでは前述のC#プログラムの解説をしていきましょう。
ここからが本題です。
C#プログラムの構造
C#プログラムは大きく分けて二つのパートから成り立っています。
ひとつは今回使用する既存のプログラムの名前を宣言している部分、もうひとつは自分で作成するプログラムの部分です。
一つ目の使用するプログラムの名前を宣言している部分というのは、冒頭の「using」から始まっているコード部分のことです。
ここではわかりやすく、「利用宣言パート」と呼ぶことにします。
二つ目の自分で作成するプログラム部分というのは、「namespace」以降の部分です。
ここではわかりやすく、「自作プログラムパート」とでも呼ぶことにしましょう。
利用宣言パート
このパートでは、今回利用する外部の既存プログラム名をひたすら宣言しています。
C#では、用途別にその名前をピリオド「.」で区切って表現するという規則があります。
これはちょうど、我々が利用している住所の概念に似ています。
例えば、「日本の中の愛知県の中の名古屋市の中の中区」だったら、「日本.愛知県.名古屋市.中区」みたいな感じで表現します。
なのでプログラムの正式名称を見るだけで、そのプログラムがどのカテゴリに属するものなのかがわかるんですね。
でも、この仕組みにはひとつ問題があります。
それは、名前を呼ぶのが大変だということです。
ひとつひとつに長い名前がついているので「じゅげむじゅげむ」ではありませんが、名前を呼んでいるだけで日が暮れてしまいます。
そうならないように、先に使用する外部プログラムのカテゴリだけ宣言しているのが、このパートになります。
先ほどの住所で例えるならば、郵便番号がこのパートに当たります。
手紙などを送る場合、郵便番号さえしっかり書けば、先ほどの「日本の中の愛知県の中の名古屋市の中の中区」というような文言は必要ありません。
なのであとは、何丁目の何番地だとか、マンション名と部屋番号だけでOKなんです。
こうするとひとつひとつの命令の名前が適度に短くなって呼びやすくなりますよね。
それではC#プログラムに戻って、事前にどうやって使用予定の外部プログラムを宣言するのかというと、「using」命令を使います。
使い方は簡単で、「using」と書いてから、半角スペースを入れて、使用する外部のプログラム名を書き、最後に「;」を書きます。
例えば、最初の行に「using System;」と書かれています。
これは、「Systemという外部のプログラムを使うよ」とC#プログラムで言っているのと同じです。
他にもいろいろな外部プログラムが「using」で使用を宣言されていますが、名前が違うだけで意味は同じです。
ここまで理解したところで、もう少し深堀して考えてみましょう。
このパートの存在意義というのは、あとに続く自作プログラムの中で「名前を短くして呼びやすくする」というものです。
では逆に、フルネームを呼ぶのが苦でないのならば、このパートは必要ありませんよね?
例えば、「using...」の行をすべて削除し、命令部分もフルネームに書き換えた以下のようなプログラムを作ったとします。
namespace Sample { internal class Program { static void Main(string[] args) { System.Console.Write("HelloWorld."); System.Console.ReadLine(); } } }
このプログラムをVisualStudioでビルドすると、問題なくビルドが成功します。
実行すると、ちゃんと「HelloWorld.」と表示され、Enterキーを押すとプログラムが終了します。
このようなコーディング方法をするには、プログラム内で使用する各命令のフルネームを知っておく必要があります。
それと、単純に書くのが面倒になるのでおすすめはできませんが、「こんな書き方もできるんだなー」ぐらいには覚えておいてください。
自作プログラムパート
ここでは自作プログラム部分の解説をします。
範囲
まず、C#プログラムの構造について学習しておきましょう。
C#プログラム部分というのは、基本的に入れ子構造になっています。
一番外側にネームスペースがあり、その中にクラスがあり、さらにその中にメソッドがあります。
これは「みかん」みたいなものを思い浮かべていただければOKです。
一番外側のみかんの皮部分がネームスペース、薄皮部分がクラス、身の部分がメソッドといったかんじでしょうか。
具体的にネームスペースの範囲は、「namespace」の次の行に書かれている「{」から始まり、最後の「}」までです。
クラスはネームスペースの中にあるので、ネームスペースの中身が始まる「{」の次の行に「class」というキーワードが書かれている行がありますよね。
その直後にある「{」から、最後から二つ目の「}」までです。
そうなるとメソッドはもうお分かりですよね。
頭から数えて三つ目の「{」から、末尾から数えて三つ目の「}」までです。
C#プログラムでは、何かの範囲が始まるときは「{」が、何かの範囲が終了するときは「}」が用いられます。
さらに、ネームスペース、クラス、メソッドといった大きな範囲を表すときには、字下げ(インデント)をして見やすくするという慣習があります。
なので、奥にあるものほど右の方から始まります。
名前
ネームスペース、クラス、メソッドこれらはある程度自由にその名前を付けることができます。
それぞれに名前を付けることができるということは、ネームスペース、クラス、メソッドこれらは別名を付けることにより、複数存在させることが可能だということです。
一つのプログラムの中に複数のネームスペース、一つのネームスペースの中に複数のクラス、一つのクラスの中に複数のメソッドを作ることができるという感じです。
まぁでもこれは、ある程度C#プログラミングに慣れてからの話で、今回はすべてひとつずつです。
それでは具体的に名前の宣言方法について説明します。
ネームスペースであれば、「namespace」と書いてから半角スペースを入れて、名前を書きます。
今回は「namespace Sample」となっているので、「Sample」というのが名前ですね。
次にクラスです。
今回はクラスの宣言が、「internal class Program」となっています。
クラスも「class」と書いて半角スペースを入れてから名前を宣言します。
なので「Program」というのがクラス名です。
さらに、「class」キーワードの前にはアクセス修飾子を付けることができます。
これは一言で説明するなら、「外からのアクセスをどの程度許すのか」という設定キーワードです。
今回使われている「internal」というアクセス修飾子は、外部アセンブリからのアクセスを禁止する指定です。
まぁ要するに、VisualStudioでビルド後に、外部ファイルに書かれているプログラムからのアクセスをブロックします。
最後はメソッドです。
たぶん、このメソッドの宣言部分が今回一番ややこしいです。
宣言部分は、「static void Main(string[] args)」という感じになっています。
メソッド名は、「(」の前に書かれている部分になります。
なのでここでは「Main」というのがメソッド名に当たります。
そして、「Main」という名前でメソッドを作った場合は、その他のメソッドとは違った特別な役割を持ったメソッドとして扱われます。
その特別な役割とは、プログラムの実行開始と、終了位置を担うメソッドとして扱われることです。
つまりプログラムが起動すると、まずは「Main」メソッドが呼び出され、「Main」メソッドの末尾まで来たらプログラムが終了するのです。
なのでマウスでダブルクリックしたら起動するようなソフトウェアを作る場合、必ず「Main」メソッドを作らなければいけません。
次はほぼすべてのメソッドが持っている機能について説明します。
ほぼすべてのメソッドは、自身が呼び出されたときに呼び出し元から何らかの値を受け取り、自身の処理が終了したときに呼び出し元に何らかの値を返します。
メソッドが呼び出されるときに外部から受け取る値のことを引数といい、メソッドが終了するときに呼び出し元に返す値のことを帰り値とか戻り値と言います。
そして、引数はカッコの中に、戻り値はメソッド名の前に書くルールになっています。
なので、引数は「string[] args」で、戻り値は「void」です。
詳しい説明はそのうちしますが、簡単に説明すると…。
引数では、このプログラムが起動するときに追加で指定されるかもしれないオプション(パラメータ)を受け取り、戻り値では、何も値は返さないという指定をしています。
最後は「static」ですね。
この「static」の説明も、詳しく説明しだすときりがないので、今は簡単に説明しておきます。
一言で説明すると、「static」とは、コンピュータ側に「このメソッドは重要だから、いつでも見えるところに置いておいてね」という指定です。
メソッド宣言をする際、これらをまとめて指定したのが「static void Main(string[] args)」です。
ネームスペース、クラス、メソッドの宣言の説明は以上です。
命令
最後は、このプログラムが起動したときに実行される命令です。
やっとここまで来ましたね。
今回使用されている命令は、以下の二つです。
Console.Write("HelloWorld."); Console.ReadLine();
このプログラムを実行すると「HelloWorld.」と表示されることから、最初の「Console.Write("HelloWorld.");」部分は、文字を表示する命令であることが推測できますよね。
その通りで、「Console.Write」は、文字を表示する命令です。
本名は「System.Console.Write」です。
表示させる文字は、カッコの中のダブルクォーテーション「"」でかこみます。
命令文が終了したらセミコロン「;」を末尾に付けます。
これで文字の表示が完了しました。
では、次の「Console.ReadLine();」とはどんな命令でしょうか?
もう文字の表示は終わっているので、これ以上やることはなさそうなんですが…。
それでもわざわざ書いてあるということは、この命令にも意味があるということですよね。
この命令の大切さを手っ取り早く知る方法があります。
それは、問題の「Console.ReadLine();」部分を削除して、再びビルドして動かしてみることです。
そうすると、「Console.ReadLine();」がどんな役割を果たしているのかがわかります。
簡単ですよね。
それではやってみてください。
いかがでしょうか?
違いはわかりましたか?
というか、ビルドは問題なくできたけど、F5キーを押して実行させても、動かないと思ったのではないでしょうか?
でも、VisualStudioのウィンドウには、「プログラムが終了しました」というようなメッセージが表示されているはずです。
ということは、ちゃんと実行もされているということですよね…。
これは一体どういうことなのでしょうか?
実は、答えはすでに説明してあります。
どういうことかというと、「Main」メソッドの説明部分で、プログラムが実行されると、「Main」メソッドが呼び出され、「Main」メソッドの終わりまで来たらプログラムが終了しますと書きましたよね。
そうなんです。
「Main」メソッドの中身を「Console.Write("HelloWorld.");」という命令一つにしてしまったので、この命令が実行された(文字が表示された)瞬間、「Main」メソッドの末尾まで来てしまったので、プログラムが終わってしまったのです。
ということは、「Console.ReadLine();」が何をしている命令なのかはもうわかりましたね。
「Console.ReadLine();」とは、「プログラムの動きを一時停止させ、Enterキーが押されたら再びプログラムを動かす」という命令です。
ちなみに本名は、「System.Console.ReadLine」です。
それと、今までわかりやすく「命令」と書いてきましたが、これはメソッドのことです。
C#側であらかじめ用意されているメソッドです。
メソッドですから、呼び出すときには名前を書いてカッコ内に引数を入れて渡します。
なので、「Console.Write」であれば、「HelloWorld.」ですね。
「HelloWorld.」は文字が連なったものなので、その他のC#命令と区別するために、ダブルクォーテーション「"」で挟んでいます。
「Console.ReadLine」の場合は、カッコ内には何も書かれていないので、引数はありません。
C#プログラム解説は以上です。
まとめ
今回は少し長くなってしまいましたね。