最も基本的なプログラム

Hello,World

これから、C#でプログラムを作る方法を学習していきましょう。まず最初は、一番基礎的で、かつ有名なサンプルであるHelloWorldを紹介します。内容は単純で、コンソール画面に「HelloWorld.」という文字列を表示するだけです。

サンプルプログラム

では実際に、そのプログラムを入力して、試してみましょう。以下のプログラムを入力・実行してみてください。VisualStudioで、プロジェクト名を「Sample101」として、自動生成されるソースコード、Program.csを、以下のように変更し、実行してみてください。

プロジェクト:Sample101/ファイル名Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sample101
{
    class Program
    {
        /*
         *  HelloWorld
         */
        static void Main(string[] args)
        {
            //  コンソールにHelloWorldと表示して終了
            Console.WriteLine("HelloWorld.");
        }
    }
}
実行結果
HelloWorld.

実行結果からもわかるとおり、このプログラムを実行すると、コンソール画面に"HelloWorld."という文字列が表示されます。このプログラムは、C#に限らず、ほとんどのプログラミング言語の入門書でいちばん最初に記述されているサンプルプログラムである、Hello,Worldと呼ばれる、簡単な文字列が画面表示されるだけのものです。

プログラムの仕組み

ネームスペース

では、一体、このプログラムはどのような仕組みになっているのでしょうか?

7行目に出てくる、namespaceという記述は、ネームスペース(日本語で、「名前空間」)と呼ばれ、このプログラムを分類する「入れ物」の名前を決める部分です。ここでは、day1というネームスペースで同一ネームスペース内に作成されるプログラムは互いに関係性が深いもものとされます。

ネームスペースの設定
namespace day1

とすることにより、このプログラムはday1と呼ばれるネームスペースに属することがわかります。

クラス名

続いて、9行目を見てみましょう、ここで、classという名前の後に、Sample101と記述されていますが、これはクラス名と呼ばれるものです。クラスの詳細については後ほど詳しく説明しますが、現時点では、C#における、プログラムのまとまった処理の単位であると考えてもらえばいいでしょう。書式は次の通りになります。

クラス名の指定
class (クラス名)

なお、同一ネームスペースには、同じ名前のクラスが存在してはいけません。逆にいえば、パッケージが異なれば、同じクラス名が存在してもかまいません。

エントリーポイント

7行目のstatic void Main(string[] args)の部分ですが、ここはエントリーポイントと呼ばれるものです。C#では、原則的にこの中に処理を書くことで、プログラムが実行されます。処理の中身は、"{"および"}"で囲まれています。この処理の中には、Console.WriteLine()という命令があり、これは、コンソールに文字を出力するものなのです。詳細については後述しますが、今な「Main()内に処理を書けば、実行される」とだけ理解してもらえれば十分です。なお、一つのプロジェクトには、1つのエントリーポイントしか置けません

Console.WriteLine

続いて、17行目のConsole.WriteLine()を見てみましょう。これは()で囲まれたものを、表示する命令です。文字列の場合は、"で挟みます。つまり、このプログラムで文字列でHelloWorld.を表示している部分はここになるわけです。

Console.WriteLineの書式
Console.WriteLine(内容);

usingとネームスペース

ところで、順序は前後しますが、1行目から、5行目まで出てくる、「using… 」となっている部分はなんでしょう?これは、usingステートメントと呼ばれるもので、C#は、.csファイルにプログラムが記述されます。VisualStudioを使うと、ある程度のコードが自動生成されますが、この時、プログラムの冒頭に数行、「using ...」と書かれた行が出現します。この、usingの後に続くのは、名前空間であり、以下のように記述すると、プログラムの中で、指定した名前空間を利用するという宣言になります。

usingステートメント
using (名前空間);

この後に、名前空間をつけることにより、そこで定義されているクラスなどが利用できるようになります。このサンプルの中には、他のネームスペースを利用しなければならないようなケースはないので、省略できます。

コメント

ところで、このプログラムの中に、出てくる//や、/*  */という記号が出てきます。しかも、その中には、文章が書いていますが、プログラムの実行結果には何も関係ないように見えます。この記号のことを、コメントと言います。

コメントは、プログラムの注釈を付けるためのもので、プログラマーが、プログラムの各所に書いて、処理の意味などを記述する時に用いられます。実行結果には何ら影響を与えませんが、これを付けるとプログラムが非常にわかりやすくなります。

そのため、プログラマーは、出来るだけコメントをつけるようにすることが勧められています。なお、コメントには、以下(表1-1)のような種類があります。

表1-1:Javaで用いられるコメント
記述方法 名前 特徴 使用例
/*  */ ブロックコメント /*と、*/の間に囲まれた部分がコメントになる。
複数行にわたってコメントをつけることが出来る。
/* 
   このように複数行
   コメント可能です。
*/
// 行コメント 一行にコメントをつけることが出来る。 // コメント

様々なコンソールへの出力処理。

サンプロプログラム

続いて、様々なコンソールへの出力の例を見てみましょう。以下のサンプルを実行して結果をみてみてください。

プロジェクト:Sample102/ファイル名Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sample102
{
    class Program
    {
        static void Main(string[] args)
        {
            //  数値の表示
            Console.Write(123);
            Console.WriteLine(456);
            //  文字列の表示
            Console.Write("ABC");
            Console.WriteLine("DEF");
        }
    }
}
実行結果
123456
ABCEDF

このように、様々な記号を表示することが出来ました。では、いったいどうしてこのような結果になるのでしょうか。

WriteとWriteLineの違い

まず、14行目と15行目、17行目と18行目の違いに注目してください。最初のサンプルでConsole.の後には、WriteLineを使っていましたが、ここでは、Writeという表現も出ています。この違いは、Write()では、()内のものを表示した後改行をしない命令であり、WriteLine()は表示後改行を行うという違いがあるのです。

そのため、14行目で「123」と表示した後、15行目で「456」と表示していて、この2つがつながるのは、「123」を表示した段階で、改行を行わないからです。17行目と18行目に関しても同じです。

文字列以外の表示

再び14行目、15行目に注目してみてください。17行目、18行目で文字列を表示する場合には、"(ダブルクォーテーション)で文字列を挟んでいるのに対し、ここでは用いていません。このように、数値を表示するときには"で挟む必要ががありません

エラーの処理

コンパイルエラー

まずは、以下のプログラムを入力、実行してみてください。

プロジェクト:Sample103/ファイル名Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sample103
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLime("HelloWorld.");
        }
    }
}

プログラムを実行しようとすると、次のようなメッセージが出ていると思います。

コンパイラが発するエラーメッセージ
1>------ ビルド開始: プロジェクト: Sample103, 構成: Debug Any CPU ------
1>c:\users\kenji.st04-sv\documents\visual studio 2012\Projects\Sample103\Sample103\Program.cs(13,21,13,30): error CS0117: 'System.Console' に 'WriteLime' の定義がありません。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

これは何を意味するのでしょうか?実はこのメッセージ、ソースコードのビルドに失敗したことを意味するメッセージなのです。つまり、このプログラムには文法上誤った記述があるということなのです。 コンパイラは、誤った記述がある場合、このようなメッセージを発します。当然ながらプログラムを実行することは出来ません。

では、一体どこに誤りがあるのでしょうか?コンパイラーの発するエラーメッセージに従い、13行目を見ると、WriteLimeとなっています。これは本来、WriteLineとすべきところを、誤って記述したものです。 そこで、ここを正しい記述に直してみましょう。

プロジェクト:Sample103/ファイル名Program.cs(再掲載)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sample103
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("HelloWorld.");
        }
    }
}

実行結果
HelloWorld.

実際にもっと複雑なプログラミングを行う場合も、このようにしてプログラムの誤りを直しながら実行することが求められます。

練習問題 : 問題1.