プログラミング言語を整える
初級C# を整える。
= 業務アプリや Unity で使われる C# を、同じお題で読んで学ぶ
C# が初めての方は、先に そもそも C# とは・どんな場面で使うか をどうぞ。
C#とは
Microsoft が .NET とともに作った静的型付けの言語で、Windows の業務アプリ・Web システム・Unity のゲーム開発で使われています。
| 誕生 | 2000年(発表) |
|---|---|
| 作った人・組織 | Microsoft(設計の中心は Anders Hejlsberg) |
| 型の付け方 | 静的型付け |
| 動かし方 | .NET の中間言語(IL)にコンパイルし、.NET のランタイムが実行時に機械語へ変換して動かす |
| ファイルの拡張子 | .cs |
| 手元で動かすには | dotnet new console -o hello && cd hello && dotnet run |
日本での使われ方
- Windows フォームや WPF を使った、社内向けの業務アプリの開発で使われています。
- ASP.NET を使った .NET の Web システム(社内システムや業務向けサービス)の開発で使われています。
- ゲームエンジンの Unity でスクリプトを書く言語が C# のため、ゲーム開発の現場で使われています。
- 開発には Microsoft の Visual Studio を使うことが多く、Windows を中心にした開発の現場でよく見かけます。
新人研修での位置づけ
Windows 向けの業務システムを扱う会社では、新人研修で C# と Visual Studio を使って画面のあるアプリやデータベースにつなぐ処理を学ぶことがあります。ゲーム会社では、Unity を使う前提で C# の基本を学ぶ研修が組まれることがあります。
関わる資格・試験
- Microsoft 認定資格(現在は Azure 開発者などの役割別の資格で、C# だけを対象にした試験はありません)
- Foundational C# with Microsoft(freeCodeCamp と Microsoft が提供する無料の認定)
- Unity Certified User: Programmer(Unity の認定。スクリプトは C# で書きます)
そもそも C# とは
Microsoft の .NET とともに育った、Windows の業務アプリからゲームまで使える言語。
C#(シーシャープ)は、2000年に Microsoft が発表した言語で、設計の中心は Anders Hejlsberg です。書いたコードは .NET の中間言語(IL)にコンパイルされ、実行時に .NET のランタイムが機械語へ変換して動かします。
型を指定する静的型付けのオブジェクト指向言語で、Java とよく似た書き方をします。Windows の画面を持つアプリや Web システムなど、Microsoft の開発環境と組み合わせて使われてきました。
どこで・どんな場面で使うか
-
Windows の業務アプリ
Windows フォームや WPF を使った、社内向けの業務アプリの開発で使われています。
-
.NET の Web システム
ASP.NET を使った、社内システムや業務向けサービスの開発に使われています。
-
Unity のゲーム開発
ゲームエンジン Unity でスクリプトを書く言語が C# のため、ゲーム開発の現場で使われます。
-
Microsoft 製品との連携
Microsoft の開発ツールやクラウドと合わせて使う開発で選ばれることがあります。
-
求人での位置づけ
「.NET」や「C#」を条件にした開発職の求人があります。Windows 環境の業務システムを扱う会社で多く見られます。
向いている場面・向いていない場面
- 向いている:Windows や Microsoft の環境で動く業務アプリ。開発ツールが充実していて、画面付きのアプリを作りやすいです。
- 向いている:Unity でゲームを作りたいとき。Unity のスクリプトは C# で書くので、ゲーム開発の入口になります。
- 向いていない:ごく小さな機器の制御。メモリの少ないマイコンのような環境は、C 言語のほうが向いています。
下のお題やクイズで、Java と見比べながら C# の書き方を確かめてみてください。
5つのお題をC#で書く
C・C++・Java・C#・COBOL・VBA の6ページで、同じ5つのお題を同じ順に並べています。言語を切り替えると、書き方の違いがそのまま比べられます。
このページではコードを実行できません。表示している出力とエラーのメッセージは、.NET SDK 8.0.132 で実際にコンパイル・実行して、一字一句同じになることを確かめたものです。
コード(.cs)
Console.WriteLine("Hello, World!");
実行すると
Hello, World!
.NET 6 以降はトップレベルステートメントが使えるため、クラスや Main メソッドを書かずに1行で動きます。using System; も ImplicitUsings の設定で自動的に入ります。
コード(.cs)
for (int i = 1; i <= 15; i++)
{
if (i % 15 == 0) Console.WriteLine("FizzBuzz");
else if (i % 3 == 0) Console.WriteLine("Fizz");
else if (i % 5 == 0) Console.WriteLine("Buzz");
else Console.WriteLine(i);
}
実行すると
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz
for 文や if 文の書き方は C 言語や Java とほぼ同じです。Console.WriteLine は数値も文字列もそのまま受け取れます。
コード(.cs)
using System.Globalization;
int[] nums = { 3, 1, 4, 1, 5, 9, 2, 6 };
int sum = nums.Sum();
double avg = nums.Average();
Console.WriteLine($"合計: {sum}");
Console.WriteLine("平均: " + avg.ToString("F2", CultureInfo.InvariantCulture));
実行すると
合計: 31 平均: 3.88
LINQ の Sum と Average を使うと、ループを書かずに合計と平均が求められます。小数の表記は OS の地域設定で変わることがあるため、CultureInfo.InvariantCulture を指定して「.」区切りに固定しています。
コード(.cs)
string[] lines = { "1行目", "2行目", "3行目" };
File.WriteAllLines("memo.txt", lines);
foreach (string line in File.ReadAllLines("memo.txt"))
{
Console.WriteLine(line);
}
実行すると
1行目 2行目 3行目
File.WriteAllLines と File.ReadAllLines は、ファイルを開く・閉じるまでを1回の呼び出しで済ませてくれます。文字コードは指定しなければ UTF-8 で書き込まれます。
コード(.cs)
int a = 10;
int b = 0;
try
{
Console.WriteLine(a / b);
}
catch (DivideByZeroException ex)
{
Console.WriteLine("エラー: " + ex.Message);
}
実行すると
エラー: Attempted to divide by zero.
整数を0で割ると DivideByZeroException という例外が発生し、try〜catch で受け止められます。10 / 0 と直接書くとコンパイラがエラーにするため、変数に入れてから割っています。
出力当てクイズ
コードを読んで、画面に出るものを選んでください。選ぶと正解と理由が出ます(答えはどこにも送られず、記録もしません)。
問1
var x = 7 / 2; Console.WriteLine(x);
画面に出るのは?
7 も 2 も整数(int)なので、割り算の結果も小数点以下を切り捨てた整数の 3 になります。var は右辺から型を決めるため、x は int 型になります。
問2
int a = 2;
int b = 3;
Console.WriteLine($"{a}+{b}={a + b}");
画面に出るのは?
先頭に $ を付けた文字列では、{ } の中に書いた式が計算されて埋め込まれます。{a + b} は足し算として計算されるため 5 になります。
問3
var p1 = new Point { X = 1 };
var p2 = p1;
p2.X = 2;
Console.WriteLine($"{p1.X} {p2.X}");
struct Point
{
public int X;
}
画面に出るのは?
struct は値型なので、p2 = p1 で中身がまるごとコピーされます。p2 を書き換えても p1 は変わりません。class(参照型)にすると同じものを指すため「2 2」になります。
問4
string? name = null; Console.WriteLine(name ?? "名無し");
画面に出るのは?
?? 演算子は、左側が null のときだけ右側の値を使います。name は null なので「名無し」が表示されます。
よくあるエラーと直し方
初めて書く人が出会いやすいエラーです。メッセージは英語のまま出ることが多いので、どの言葉を手がかりにすればよいかもあわせて載せています。
コンパイル時 セミコロンの付け忘れ(CS1002)
エラーになるコード
Console.WriteLine("1行目")
Console.WriteLine("2行目");
画面に出るメッセージ(抜粋)
error CS1002: ; expected
何が起きているか:C# では文の終わりに「;」が必要です。1行目の Console.WriteLine("1行目") の末尾に「;」が無いため、コンパイラが文の区切りを見つけられずに止まります。
直し方:エラーに表示された行番号の文の末尾に「;」を付けます。
コンパイル時 宣言していない変数を使う(CS0103)
エラーになるコード
int count = 3; Console.WriteLine(cnt);
画面に出るメッセージ(抜粋)
error CS0103: The name 'cnt' does not exist in the current context
何が起きているか:宣言されていない名前 cnt を使っているため、コンパイラが何を指すのか分からずに止まります。打ち間違いや、宣言した場所(スコープ)の外で使っていることがよくある原因です。
直し方:変数名のつづりを宣言と合わせるか、使う前に変数を宣言します。
実行時 NullReferenceException
エラーになるコード
string? text = null; Console.WriteLine(text.Length);
画面に出るメッセージ(抜粋)
System.NullReferenceException: Object reference not set to an instance of an object.
何が起きているか:中身が null の変数に対して .Length のようにメンバーを使おうとしたため、実行中に例外が発生して止まります。Nullable が有効なプロジェクトでは、コンパイル時に警告(CS8602)も出ます。
直し方:使う前に null でないか確かめるか、text?.Length や ?? 演算子で null のときの値を決めておきます。
実行時 IndexOutOfRangeException
エラーになるコード
int[] nums = new int[3]; Console.WriteLine(nums[3]);
画面に出るメッセージ(抜粋)
System.IndexOutOfRangeException: Index was outside the bounds of the array.
何が起きているか:要素が3つの配列で使える番号は 0〜2 です。nums[3] は範囲の外なので、実行中に例外が発生して止まります。
直し方:番号が 0 から nums.Length - 1 の範囲に収まっているか確かめます。全部の要素を順に扱うときは foreach を使うと範囲外になりません。
ほかの言語の解説
- C言語 1972年・静的型付け
- C++ 1983年(1979年に「C with Classes」として開発が始まりました)・静的型付け
- Java 1995年・静的型付け
- COBOL 1959年・静的型付け(PIC 句で桁数と種類を宣言する)
- VBA 1993年(Excel 5.0 に搭載)・型を宣言しなくても動きます(Variant 型になる)。Option Explicit を書くと変数の宣言を強制できます
6言語の並べての比較は プログラミング言語を整える にあります。 書いたコードはどこにも送られません(このページに入力欄はクイズの選択だけで、選んだ答えも記録しません)。
このツールについて
Microsoft が .NET とともに作った静的型付けの言語で、Windows の業務アプリ・Web システム・Unity のゲーム開発で使われています。
C# の概要と、同じ5つのお題・出力当てクイズ・よくあるエラー(CS1002 など)。出力は .NET 8 で確かめたもの。
主な機能
- 概要(誕生・作った人・型・動かし方)と日本での使われ方・新人研修・資格
- 5つのお題のコード例(C・C++・Java・COBOL・VBA の同じお題へ移れる)
- 出力当てクイズ4問(構造体のコピー・?? 演算子など)
- よくあるエラー4件(コンパイラ・実行時の実際のメッセージ・原因・直し方)
- 出力は .NET SDK 8 で照合済み・送信ゼロ
よくある質問
Q. このページで C# のコードを実行できますか?
A. できません。解説だけのページです。表示している出力とエラーのメッセージは、.NET SDK 8.0.132 で実際にビルド・実行して確かめたものです。
Q. コードに class や Main が無いのはなぜですか?
A. C# 9 から使える「トップレベルステートメント」で書いているためです。.NET 6 以降の dotnet new console が作る雛形もこの書き方です。
Q. C# は日本ではどこで使われていますか?
A. Windows の業務アプリ(Windows フォーム・WPF)、ASP.NET の Web システム、Unity のゲーム開発などです。
入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。
続けて整える
データの時点:各ページに記載の版(各プロジェクトの公式リリース)