C#

C#入門

.NETのコンソールアプリを作り、実行結果を確かめながら基礎を学びましょう。

この講座は.NET 8以降を対象にしています。

01

C#を実行してみよう

C#はWeb、デスクトップ、クラウド、ゲームなどで使われる型安全な言語です。.NET SDKを導入し、作業用フォルダーで次を実行します。

作成と実行COMMAND
dotnet new console
dotnet run
Program.csC#
Console.WriteLine("こんにちは、C#!");
実行結果OUTPUT
こんにちは、C#!

現在のテンプレートは、定型的なclass ProgramMainを省略したトップレベルステートメントを使います。

02

変数とデータ型

型を明示するか、varで初期値から推論します。一度決めた変数の型は変わりません。

主な型C#
string name = "Mity";
int age = 20;
double height = 170.5;
bool isStudent = true;
decimal price = 198.50m;

Console.WriteLine($"{name}さん {age}歳 {height:F1}cm");
Console.WriteLine($"学生: {isStudent}, 価格: {price}円");
実行結果OUTPUT
Mityさん 20歳 170.5cm
学生: True, 価格: 198.50円
decimal 10進数の金額計算に向く型で、リテラルの末尾にmを付けます。実務では定められた税と丸めのルールに従います。
03

入力と型変換

Console.ReadLine()は文字列またはnullを返します。string??は、文字列だけでなくnullも入り得ることを表すnull許容参照型の注釈です。初心者の入力処理では、例外を出さないTryParseが便利です。

年齢を受け取るC#
Console.Write("年齢: ");
string? text = Console.ReadLine();

if (int.TryParse(text, out int age))
{
    Console.WriteLine($"来年は{age + 1}歳です");
}
else
{
    Console.WriteLine("整数で入力してください");
}
実行例OUTPUT
年齢: 20
来年は21歳です
04

演算子と条件分岐

比較に== != < > <= >=、論理演算に&& || !を使います。

点数を判定C#
int score = 82;
string result;

if (score >= 80) result = "合格(よくできました)";
else if (score >= 60) result = "合格";
else result = "再挑戦";

Console.WriteLine(result);
実行結果OUTPUT
合格(よくできました)
05

繰り返し

回数が決まるときはfor、コレクションを順に読むときはforeachが分かりやすい書き方です。

回数を表示C#
for (int i = 1; i <= 3; i++)
{
    Console.WriteLine($"{i}回目");
}
実行結果OUTPUT
1回目
2回目
3回目
whileの条件 更新処理を忘れると無限ループになります。breakは終了、continueは今回のみ飛ばします。
06

配列、List、Dictionary

配列は長さ固定、List<T>は追加・削除できる並び、Dictionary<TKey,TValue>はキーと値の組です。

複数の値C#
var fruits = new List<string> { "りんご", "みかん" };
fruits.Add("ぶどう");
var scores = new Dictionary<string, int> { ["Aki"] = 82, ["Mika"] = 91 };

foreach (string fruit in fruits) Console.WriteLine(fruit);
Console.WriteLine($"Mika: {scores["Mika"]}点");
実行結果OUTPUT
りんご
みかん
ぶどう
Mika: 91点

存在しないキーはTryGetValueで確認すると安全です。

07

メソッド

戻り値の型、名前、引数の順に定義します。

合計を返すC#
static int CalculateTotal(int price, int count)
{
    return price * count;
}

int total = CalculateTotal(500, 3);
Console.WriteLine($"合計: {total}円");
実行結果OUTPUT
合計: 1500円

トップレベルのコードで定義するローカル関数は、呼び出しコードより後ろに書いても構いません。

08

例外処理

ファイル不存在など、想定して対応できる例外をtrycatchで処理します。

整数に変換C#
try
{
    int number = int.Parse("十");
    Console.WriteLine(number);
}
catch (FormatException)
{
    Console.WriteLine("数字の形式ではありません");
}
実行結果OUTPUT
数字の形式ではありません
握りつぶさない catch (Exception) { }で全てを無視すると原因が分からなくなります。対応できる例外のみを捕捉します。
09

ファイルの読み書き

File.WriteAllTextFile.ReadAllTextで小さなテキストを扱えます。

保存して読むC#
string path = "memo.txt";
File.WriteAllText(path, "C#を学習中\n");
string text = File.ReadAllText(path);
Console.Write(text);
実行結果OUTPUT
C#を学習中

大きなファイルはStreamReaderで順に読みます。利用者入力をそのままパスに使わず、IOExceptionやアクセス権限も想定しましょう。

10

クラスとプロパティ

クラスはデータと操作をまとめた型です。requiredは生成時の設定忘れをコンパイラが検出します。

Program.csC#
var product = new Product { Name = "ノート", Price = 180 };
Console.WriteLine(product.Label());

class Product
{
    public required string Name { get; init; }
    public int Price { get; set; }
    public string Label() => $"{Name}: {Price}円";
}
実行結果OUTPUT
ノート: 180円

通常はクラス定義を別ファイルに置きます。トップレベルステートメントより後ろに型定義を書きます。

11

NuGetとテスト

NuGetは.NETのパッケージ管理です。正確なパッケージ名、公開元、ライセンスを確認してから追加します。

基本コマンドCOMMAND
dotnet add package PackageName
dotnet list package
dotnet build
dotnet test
バージョン管理 .csprojと必要なロック情報はGitへ登録しますが、bin/obj/は通常登録しません。
PRACTICE

ミニ課題:成績集計

名前と点数を持つStudentクラスを作り、List<Student>から平均点と合格者を表示してください。

完成条件
  • 0〜100以外の点数を受け付けない
  • 60点以上を合格とする
  • 通常値と0点・100点の境界値をテストする
NEXT

次に学ぶこと

基礎を終えたら、目的に合わせて.NETの機能とフレームワークへ進みましょう。

C#の発展テーマ
  • LINQ:コレクションの抽出、並べ替え、集計を宣言的に書く
  • ASP.NET Core:WebアプリやWeb APIを作る
  • Entity Framework Core:C#のオブジェクトとデータベースを対応させる
  • xUnit:自動テストを整理し、変更後の回帰を防ぐ

まずLINQで成績集計の抽出と平均計算を書き換え、xUnitで境界値をテストすると、この講座のコレクションとクラスを発展させられます。