C# 初級講座 |
![]() |
2023/10/7
この記事が対象とする製品・バージョン
![]() |
Visual Studio 2022 | ◎ | 対象です。 |
![]() |
Visual Studio 2019 | △ | 対象外ですが参考にはなります。 |
![]() |
Visual Studio 2017 | △ | 対象外ですが参考にはなります。 |
![]() |
Visual Studio 2015 | △ | 対象外ですが参考にはなります。 |
![]() |
Visual Studio 2013 | △ | 対象外ですが参考にはなります。 |
![]() |
Visual Studio 2012 | △ | 対象外ですが参考にはなります。 |
![]() |
Visual Studio 2010 | △ | 対象外ですが参考にはなります。 |
![]() |
Visual Studio 2008 | △ | 対象外ですが参考にはなります。 |
![]() |
Visual Studio 2005 | △ | 対象外ですが参考にはなります。 |
![]() |
Visual Studio.NET 2003 | × | 対象外です。 |
![]() |
Visual Studio.NET (2002) | × | 対象外です。 |
Visual Studio Code | × | 対象外です。 |
目次
英語の勉強がA, B, C…を学習するところから始まり、算数の勉強が1,2, 3…を学習するところから始まるように、C# もはじめのうちは、少し退屈な時間を過ごして基本的な要素を勉強する必要があります。変数と型です。
さっそく始めましょう。コンソールアプリを作成して実際に試しながら読んでみてください。
コンソールアプリを作成するにはVisual Studio 2022以上で新しいプロジェクトの作成を選択し、コンソールアプリのプロジェクトテンプレートを選択します。
下記の設定で新規プロジェクトを作成してください。
プロジェクトテンプレート | コンソール アプリ |
---|---|
プロジェクト名 | VariableLesson |
ソリューション名 | VariableLesson |
フレームワーク | .NET 6.0 |
コンソールアプリは最もシンプルなアプリケーションです。
プロジェクトを作成するとソリューションエクスプローラーは次のようになります。
コンソールアプリではプログラムは基本的に Program.cs ファイルに記述します。お好みでファイルを増やして、別のファイルにプログラムすることも可能です。少し大きなプログラムを作ろうとする場合は、複数のファイルにプログラムすることになるでしょう。
テンプレートではProgram.cs内にはじめから次のような2行のプログラムがあります。
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
これはコンソールに"Hello, World!"と表示しなさいという命令です。
ひとまず、何が起こるのか実行して確認してみましょう。
実行すると次のように黒いウィンドウが開いて、Hello, World! と表示されます。この黒いウィンドウをコンソールウィンドウまたは単にコンソールと呼びます。
Hello, World!に続いて複数行にわたってメッセージが表示されます。何かキーを押すとコンソールが閉じ、実行は終了します。
プログラム自体は Hello, World! を表示する命令しかないので、1行目を出力した段階で終わっています。
しかし、それだと一瞬でプログラムが終了し、コンソールも閉じてしまいますから、結果をじっくり確認できるようにVisual Studioがメッセージを表示して、キーが押されるまでウィンドウが閉じないようにしてくれています。
Visual Studioを使わないでこのプログラムを実行すると下側に表示されているメッセージは表示されず、キーを押すのも待ってくれず実行が終了するとすぐウィンドウが閉じます。あまりに速いので、何が表示されたのか確認することは困難です。
それを試したい場合は、生成されたexeファイルを直接実行します。exeファイルの場所は、ちょうどメッセージに出力されるようになっているのですぐにわかります。
さて、コンソールアプリがどんなものかわかったところで、これを使って勉強を開始しましょう。
コンソールアプリのテンプレートはほんの小さなプログラムですが、学習のはじめなので学ぶべきところがたくさんあります。
Console.WriteLine("Hello, World!");
Console.WriteLine (読み方:Console=コンソール、WriteLine=ライトライン) はコンソールに 指定された文字を出力する機能です。
これは C# ではなく、フレームワークの機能です。
C# からフレームワークの機能を呼び出す代表的な方法はメソッドを呼び出すことです。フレームワークには(おそらく)数万から数十万個のメソッドがあり、それぞれ何らかの機能を実行します。
ここで呼び出しているメソッドは WriteLine です。
フレームワークのメソッドはすべて「クラス」または「構造体」というものに含まれています。メソッドを呼び出すときは必ずそのメソッドを含んでいるクラスまたは構造体を使用する必要があります。クラスまたは構造体もおそらく数千個くらいはあります。
このプログラムが利用しているWriteLineメソッドは Consoleクラスに含まれています。
イメージすると次の図のような構造です。この図にはたったの6個しかクラスまたは構造体がありませんがこれが何千個とあるところを想像してください。
さらに、すべてのクラスまたは構造体は「名前空間」(なまえくうかん)というもので分類されています。名前空間はフォルダーのようなもので、それ自体には何の機能もなく、単にクラスまたは構造体を分類するための入れ物です。
異なる名前空間には名前が同じクラスが存在する場合もあります。ちょうど異なるフォルダーに名前が同じファイルが存在できるのと同じです。
Consoleクラスは System (読み方:System=システム)という名前の名前空間に含まれています。System名前空間は最も基本的な機能が分類されている名前空間です。
簡単に図式化すると次のような3階層の入れ物になっているということです。
本来クラスを記述するときは、名前空間から記述する必要があります。
Consle.WriteLineメソッドの呼び出しを名前空間を明示して記述すると次のようになります。
System.Console.WriteLine("Hello, World!");
これで実行しても最初と同じ結果になります。ちょっとやってみてください。
やってみるとわかるのですが、Visual Studio 上ではSystem. という部分はグレーの色で表示されます。
グレーで表示される部分は、この部分を記述する必要がないことを示しています。
よく使う名前空間をいちいち記述していたらプログラムが煩雑になってしまうので、コンソールアプリでは次の7つの名前空間は記述しなくても暗黙的に使用できることになっています。
名前空間の名前には「.」が使用できるので、「System.IO」という名前空間はこれで1つの名前空間です。決して、System名前空間内にあるIO名前空間という意味ではありません。
暗黙的に使用できる名前空間はプロジェクトテンプレートによって異なる場合があります。そのため、たとえば、コンソールアプリでうまく動いていたプログラムをコピーして、別の種類のプログラムに貼り付けると、名前空間の設定の違いによりエラーになる場合があります。
こういうことがあるので、インターネットで良さそうなプログラムを見つけてコピーしてもそのままでは実行できないということが時々あります。実行できない原因は名前空間だけではないかもしれませんが、名前空間の件は、ある程度学習したプログラマーには常識なので、プログラムを公開する側もそのことをいちいち注意書きしてくれていないことが多いです。
それでは、ここからいくつかプログラムを試して変数がどういうものか見ていきましょう。
読むだけではなく、実際に手を動かしてやってみることをおすすめします。
変数の基本的なことは入門講座で既に説明していますから、もっと基本から説明が必要な人は入門講座 第6回 文字・数値・日付のあつかい を読んでください。
まず、Program.cs内のプログラムを下記2行に置き換えてください。
string message = "こんにちは";
Console.WriteLine(message);
Visual Studio は次のような状態になります。
実行すると「こんにちは」と表示されます。
このプログラムでは message という名前の変数を作成しており、その値を "こんにちは" にしています。
そして、フレームワークの機能 Console.WriteLineメソッドを使って 変数message の内容を表示するように指示しています。
これだと変数のありがたみがないので、もう少し改造してみましょう。
次のように改造してみます。
string message = "こんにちは";
Console.WriteLine(message + ", 徳川家康さん。");
Console.WriteLine(message + ", 織田信長さん。");
+ を使って、文字列を結合させています。
実行すると、次のように表示されます。
こんにちは、徳川家康さん。
こんにちは、織田信長さん。
挨拶の文言が変数になっているので、1か所を「こんばんは」にも変更すると、表示は2行とも「こんばんは」になります。
string message = "こんばんは";
Console.WriteLine(message + ", 徳川家康さん。");
Console.WriteLine(message + ", 織田信長さん。");
こんばんは、徳川家康さん。
こんばんは、織田信長さん。
この1個変更すれば、それを使っている全部の箇所が連動するというのが変数の良いところですね。
こんな短い例だと大したことないように感じるかもしれませんが、大きなプログラムで同じ値を使う場合に、変数になっているのとそうでないのとで、苦労は大違いです。
このプログラムのポイントは3つあります。
言葉もいくつか覚えてもらう必要があります。
1つ目のポイントは 変数の宣言と初期化です。
このプログラムでは、この1行で変数messageを作成し、その変数の値に"こんばんは"を設定しています。
string message = "こんばんは";
変数を作成することを「宣言」(せんげん)と呼びます。
変数に値を設定することを「代入」(だいにゅう)と呼びます。
変数に最初に値を代入することを「初期化」(しょきか)と呼びます。
この1行は次のように2行に分けても同じ意味です。
string message;
message = "こんばんは";
この場合、1行目で変数の宣言、2行目で変数の代入をしているということになります。
直感的にわかると思いますが、変数は使う前に宣言する必要があります。
だから、次のプログラムはエラーです。
message = "こんばんは";
string message;
最初に宣言してあれば、その後は何度代入しようが使用しようが自由です。
string message;
message = "こんばんは";
message = "おはよう";
Console.WriteLine(message + ", アリストテレスさん。");
このプログラムでは、最初「こんばんは」を代入していますが、次に「おはよう」を代入しているので、Console.WriteLineを実行した時点でではmessageの値は「おはよう」になっています。
ですから、実行すると次のように「おはよう」が表示されます。
おはよう、アリストテレスさん。
変数の名前は宣言時に決定します。
名前はアルファベットを使うことが多いですが、お好みなら日本語も使えます。
変数名の一部を数字にすることはできますが、先頭を数字にすることはできません。
記号は _ のみ使用できます。
次の宣言はすべて有効です。
string ユーザー名;
string userName;
string userName2;
string USER_NAME;
string _userName;
多くのプログラマーは、変数名を英語と数字の組み合わせで書きます。複数の単語からなる変数名を付けるときは、先頭は小文字にして、2つ目以降の単語の先頭を大文字にします。
たとえば、lastLogonUserName や totalCount のような感じです。日本人のプログラマーは英単語ではなくローマ字を使う場合もあります。たとえば、tantoushaName, todoufukenCode などです。このように先頭の単語はすべて小文字、それ以降の単語は先頭を大文字にするという名前付けのルールを「キャメル規約」(Camel Case)と呼びます。
C# では大文字と小文字が違えば別の変数となるので注意してください。大文字と小文字を区別することをケースセンシティブ(Case Sensitive)と言います。
たとえば、次のプログラムはエラーです。
string message = "こんにちは";
Console.WriteLine(Message); //ここでエラー
なぜなら、Message という宣言されていない変数を使用しようとしているからです。宣言されているのは大文字と小文字が違う message という変数です。
C# のキーワードとして用意されているもの(=予約語)は通常は変数名に使用することはできません。
たとえば、string や void、function という言葉は C# のプログラムで使用するキーワードなので通常は変数名にできません。
2つ目のポイントは string (読み方:string=ストリング)というキーワードです。
string というキーワードは、ここで宣言(せんげん)する変数が文字列型であることを示しています。string型と呼ぶ場合もあります。
「型」とは何か。初級プログラマーが勉強しなければならない重要な言葉の1つです。この連載でも『徐々に』説明していきます。ひとまずは、文字列や数値や日付など値の種類のようなものだと理解しておきましょう。
C#のすべての変数や値には型があり、文字列型はその1つです。だから、文字列型以外の変数を宣言する場合は string ではなく、その変数の型に応じたキーワードを使用して変数を宣言することになります。
たとえば、今回は説明しませんが、数値を表す int や 日付を表す DateTime などの型を使って変数を宣言する場合は、次のようになります。
int userCount;
DateTime creationDate;
3つ目のポイントは + で文字列を結合していることです。
+ や -、/ 、 * などは何かの処理を行う特別な目印で、「演算子」(えんざんし)と呼ばれます。
演算子を使用した時にどのような処理が行われるかは「型」によって違います。
たとえば + の場合、数値ならばたし算の処理を行います。文字列型ならば文字列の結合を行うという具合です。
+のような理解しやすい演算子の他、^ や !、?? のような記号だけ見てもよくわからない演算子や、new, typeof などのような記号ではない演算子も存在します。
代入を行う = も演算子です。 = の行う「何かの処理」とはそのまま「代入」のことです。
演算子については今後登場する都度説明することとします。
C#にどんな演算子があるか気になる方はここで確認できます。ただし、初心者向けの説明ではありません。
C# 演算子と式 - C# リファレンス | Microsoft Learn
次の回では、数値について勉強します。