言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

C#辞典

  1. トップページ
  2. C#辞典
  3. 初心者向け: 概要と特徴、学習順ガイド

初心者向け: 概要と特徴、学習順ガイド

C#の文法・特徴・学習順を整理した入口ページです。静的型付けとGCによるメモリ管理・LINQによるデータ操作・async/awaitによる非同期処理・実行の仕組み(IL/CLR)・開発ツールまでをまとめています。

C#の歴史・誕生の経緯(MicrosoftとSunの対立、Hejlsbergさんの設計思想)・バージョンの進化・他言語との関係については、C#の歴史と系譜にまとめています。

C#とは何か

C#は2002年にリリースされた、Javaのメモリ安全性・C言語系の構文・Delphiの開発効率を組み合わせた静的型付けの汎用言語です。Microsoftの.NET(ドットネット)プラットフォーム上で動作し、.NET 5(2020年)以降はWindows・Linux・macOSのいずれでも使えます。UnityのスクリプトはC#のみで書き、ASP.NET CoreはWebバックエンドの主力フレームワークです。

C#の誕生背景・Hejlsbergさんの設計哲学・バージョンごとの進化・他言語との影響関係については、C#の歴史と系譜を参照してください。

ファイル拡張子

C# のソースコードは以下の拡張子のファイルに保存します。

  • .cs — C# ソースファイル
  • .csproj — プロジェクト設定(XML)

最初に知っておく 5 つのポイント

  • 静的型付け言語で、型の不一致はコンパイル時に検出される。変数宣言で型を明示する(または var で推論させる)ことが基本。
  • メモリ管理はガベージコレクタ(GC)が自動で行う。CやC++のような手動の malloc/free は不要。ただし長時間動くリアルタイムシステムではGC pauseに注意が必要。
  • LINQはC#の代表的な機能。配列・リスト・データベースなど異なるデータソースを、同じ構文でフィルタリング・並び替え・集計できる。
  • async/awaitで非同期処理が同期コードと同じ書き方で書ける。この構文はC#が先行して導入し、後にJavaScript・Python・Kotlinなどに影響を与えた。
  • 実行はIL(中間コード)→ CLR(JITまたはAOT)の2段階。JavaのJVM方式と同じ発想で、同じILがWindows・Linux・macOSで動作する。

C#の誕生経緯・設計思想・系譜については、C#の歴史と系譜を参照してください。

C#の特徴 — 長所と短所

C#にはほかの言語と比べたときの特徴があり、それぞれ長所にも短所にもなります。どちらが優れているという話ではなく、プロジェクトの規模・目的・チーム体制によって向き不向きが変わります

静的型付け言語である

C#は変数や引数・戻り値に型を明示する静的型付け言語です。型の不一致はコンパイル時(実行前)にエラーとして検出されます。

// 型を明示して宣言する
string name = "item_a1";
int score = 80;

// 間違った型を代入しようとするとコンパイルエラーになる
// name = 100; // エラー: cannot implicitly convert type 'int' to 'string'

型を明示するため記述量が増えますが、IDE(Integrated Development Environment — コード編集・実行・デバッグを1つにまとめた開発ツール)の補完が正確になり、大規模なコードベースでも型の不一致によるバグを事前に防げます。

ガベージコレクション

CやC++では、プログラマーがメモリの確保と解放を手動で管理する必要があります。C#ではガベージコレクター(GC)が不要になったメモリを自動的に解放します。

メモリ管理の手間が省けますが、GCが動作するタイミングで処理が一時停止する場合があります(GC pause)。リアルタイム性が極めて重要なシステムでは、このGCの停止時間が問題になることがあります。

LINQ — データ操作の統一構文

C#にはLINQ(Language Integrated Query、リンク)という機能があります。配列・リスト・データベース・XMLなど異なるデータソースを、同じ構文でフィルタリング・並び替え・集計できます。

var numbers = new List<int> { 5, 12, 3, 8, 20 };

// 10より大きい数を昇順で取得
var result = numbers.Where(n => n > 10).OrderBy(n => n);

SQL的な記述をコードの中に直接書けるため、コレクション操作が簡潔になります。

C#の特徴まとめ

特徴長所短所・注意点
静的型付け型の不一致をコンパイル前に検出できる記述量が増える
ガベージコレクションメモリ管理を意識せずに開発できるGC pauseが発生する場合がある
LINQデータ操作の記述が簡潔になる慣れるまで読み書きに時間がかかる
.NETプラットフォーム豊富なライブラリと長期サポートエコシステムがMicrosoft主導
UnityサポートUnity でのスクリプト言語として採用UnityのC#バージョンは最新より古い場合がある

実行の仕組み

C#のコードが実際に動くまでの流れを整理します。この仕組みを知っておくと、エラーメッセージの意味やパフォーマンスの話が理解しやすくなります。

C#は「コンパイル言語」ですが、機械語に直接変換するのではなく、中間コードを経由する2段階の仕組みになっています。

ソースコード (.cs ファイル) csc(コンパイラ) 中間コード(IL) (.exe / .dll ファイル) CLR(JITコンパイル) 機械語 (CPUが直接実行) CLR (Common Language Runtime) IL は OS を問わず動作する。機械語への変換は実行時に CLR が行う。

IL(中間コード)とCLRの役割

C#のコンパイラ(csc)はソースコードを「IL(Intermediate Language、中間言語)」と呼ばれるコードに変換します。ILは特定のCPU(Central Processing Unit — コンピュータの演算処理を行う中央演算装置)に依存しない中間形式です。

実行時には、CLR(Common Language Runtime、コモン・ランゲージ・ランタイム)がILをJIT(Just-In-Time)コンパイルしてその場で機械語に変換し、CPUに渡します。

この仕組みのおかげで、同じILのファイルがWindows・Linux・macOSで動作します。これは Javaのバイトコードを JVM(Java Virtual Machine — Javaのバイトコードを実行する仮想マシン)で実行するのと同じ考え方です。

Roslynコンパイラ

C#のコンパイラは、2014年以降「Roslyn(ロズリン)」と呼ばれるオープンソースのコンパイラプラットフォームに置き換わっています。Roslynの特徴は、コンパイラ自体がC#で書かれていることと、コンパイラの内部API(構文解析・型チェック・コード生成)を外部から利用できるように設計されている点です。

Visual StudioやVS Codeで表示されるリアルタイムのエラー検出・コード補完・リファクタリング候補は、Roslynのコンパイラ内部APIを呼び出すことで実現されています。IDEとコンパイラが同じコード解析エンジンを共有しているため、エディタ上の表示と実際のコンパイル結果が一致します。

実際の実行手順

sample_hello.cs
using System;

class Program {
    static void Main() {
        Console.WriteLine("Hello, World!");
    }
}

コンパイルして実行すると次のようになります。

dotnet run
Hello, World!

現在は dotnet run コマンド1つでコンパイルと実行を同時に行えます。内部では自動的にコンパイル→IL生成→CLR実行が行われています。

AOTコンパイル — 事前コンパイルという選択肢

上で説明したJITコンパイル(実行時に機械語に変換する方式)に加えて、.NET 7以降ではAOT(Ahead-Of-Time)コンパイルも選択できるようになりました。AOTコンパイルではビルド時点で機械語に変換するため、起動時間が短くなります。

JITコンパイルは実行中にコードの使われ方を観測しながら最適化できるため、長時間動くサーバーアプリケーションなどでは高いパフォーマンスを発揮します。一方、AOTコンパイルは起動の速さが重視されるコマンドラインツールやモバイルアプリに向いています。

変数と型

C#は静的型付け言語なので、変数を宣言するときに型を指定します。

基本的な型

C#で最もよく使う型の宣言例です。

string name = "item_b2"; // 文字列
int count = 20; // 整数
double rate = 3.5; // 小数
bool isActive = true; // 真偽値

var — 型推論

var を使うと、右辺の値から型を推論させることができます。型が省略されるわけではなく、コンパイラが自動的に型を決定します。

var name = "item_b2"; // string と推論される
var count = 20; // int と推論される
var rate = 3.5; // double と推論される

主な型一覧

説明
int32ビット整数42, -10
long64ビット整数(大きな数)9_999_999_999L
double64ビット浮動小数点数3.14
float32ビット浮動小数点数3.14f
decimal高精度小数(金額計算向け)9.99m
bool真偽値true, false
char1文字'A'
string文字列"Hello"
object全ての型の基底型何でも代入できる

クラスとオブジェクト

C#はオブジェクト指向言語です。データと処理をひとまとめにした「クラス」を定義し、そこから「オブジェクト(インスタンス)」を作成して使います。

クラスの定義とインスタンス生成

クラスを定義し、インスタンスを生成してメソッドを呼び出すサンプルです。

// クラスの定義
class Member {
    public string Name;
    public int Score;

    public void Report() {
        Console.WriteLine(Name + " のスコア: " + Score);
    }
}

// インスタンスの生成
Member member = new Member();
member.Name = "item_b2";
member.Score = 28;
member.Report();
item_b2 のスコア: 28

コンストラクター

インスタンス生成時に自動的に呼ばれる初期化処理をコンストラクターといいます。

class Member {
    public string Name;
    public int Score;

    // コンストラクター
    public Member(string name, int coeff) {
        Name = name;
        Score = coeff;
    }

    public void Report() {
        Console.WriteLine(Name + " のスコア: " + Score);
    }
}

var member = new Member("item_b2", 28);
member.Report();
item_b2 のスコア: 28

クラス・継承・インターフェース等の詳細はIEnumerable / IList等の各ページで解説しています。

コレクション — List と Dictionary

C#でよく使うコレクションの基本を押さえておきます。

List<T> — 可変長の配列

List<T> は要素を自由に追加・削除できる配列です。T には格納する型を指定します。

var names = new List<string>();
names.Add("item_a1");
names.Add("item_b2");
names.Add("item_a3");

Console.WriteLine(names.Count); // 3
Console.WriteLine(names[0]); // item_a1
3
item_a1

Dictionary<TKey, TValue> — キーと値のペア

Dictionary<TKey, TValue> はキーと値のペアを格納するコレクションです。

var scores = new Dictionary<string, int>();
scores["item_a1"] = 78;
scores["item_b2"] = 28;
scores["item_c4"] = 44;

Console.WriteLine(scores["item_b2"]); // 28
28

List・Dictionaryの各メソッドの詳細はList.Add() / Remove() / Clear()Dictionary.Add() / Remove() / Clear()で解説しています。

文字列操作

C#の string 型には豊富なメソッドが用意されています。

string s = "item_a1";

Console.WriteLine(s.Length); // 7
Console.WriteLine(s.ToUpper()); // ITEM_A1
Console.WriteLine(s.Contains("_a")); // True
Console.WriteLine(s.Replace("_a1", "_x1")); // item_x1

// 文字列補間($"...")で変数の値を埋め込めます(C# 6以降)。
int score = 78;
string message = $"{s} のスコアは {score} です。";
Console.WriteLine(message);
7
ITEM_A1
True
item_x1
item_a1 のスコアは 78 です。

$"..." は文字列補間(string interpolation)といい、{変数名} で変数の値を埋め込めます(C# 6以降)。

C# の string は不変(immutable)です。Replace()ToUpper() などのメソッドは元の文字列を変更せず、新しい文字列オブジェクトを返します。ループ内で大量の文字列連結を行う場合は StringBuilder を使うとメモリ割り当ての回数を抑えられます。

文字列操作の各メソッドはstring.Length / IndexOf()等の各ページで詳しく解説しています。

LINQ — コレクションの操作

LINQ(Language Integrated Query)は、コレクションやデータソースを統一した構文でフィルタリング・変換・集計する機能です。using System.Linq; を追加して使います。

using System.Linq;

var people = new List<string> {
    "item_a1",
    "item_b2",
    "item_a3",
    "item_c4",
    "item_a5"
};

// "a" を含む要素を取得
var filtered = people.Where(p => p.Contains("a")).ToList();

foreach (var name in filtered) {
    Console.WriteLine(name);
}
item_a1
item_a3
item_a5

よく使うLINQメソッド

メソッド説明
Where()条件でフィルタリング
Select()各要素を変換して新しいシーケンスを生成
OrderBy() / OrderByDescending()昇順・降順の並び替え
Count()要素数を返す
Sum() / Average()合計・平均を計算
First() / Last()最初・最後の要素を返す
Any() / All()条件を満たす要素があるか / 全要素が条件を満たすか
ToList() / ToArray()結果をList・配列に変換

LINQの各メソッドの詳細はEnumerable.Where()等のページで解説しています。

例外処理

予期しないエラーが発生したときの処理を例外処理といいます。C#では try-catch-finally を使います。

try {
    int[] arr = { 1, 2, 3 };
    Console.WriteLine(arr[5]); // 範囲外アクセス
}
catch (IndexOutOfRangeException ex) {
    Console.WriteLine("エラー: " + ex.Message);
}
finally {
    Console.WriteLine("必ず実行される");
}
エラー: Index was outside the bounds of the array.
必ず実行される

try ブロックに例外が発生しそうな処理を書き、catch で例外を受け取って処理します。finally は例外の有無にかかわらず必ず実行されます(ファイルやリソースのクローズ処理などに使います)。

例外処理の詳細はtry-catch-finallyで解説しています。

ファイルI/O

ファイルの読み書きは File クラスと StreamReader / StreamWriter で行います。

File.WriteAllText / File.ReadAllText

短いテキストの書き込みと読み込みのサンプルです。

using System.IO;

// ファイルへの書き込み(上書き)
File.WriteAllText("log.txt", "item_c4 のスコア: 44");

// ファイルの読み込み
string content = File.ReadAllText("log.txt");
Console.WriteLine(content);
item_c4 のスコア: 44

File.WriteAllText は短いテキストの書き込みに向いています。大きなファイルには StreamWriter の方が適切です。

ファイルI/Oの詳細はFile.ReadAllText() / WriteAllText()で解説しています。

非同期処理 — async/await

ファイルの読み書きやHTTPリクエストなど、時間がかかる処理を非同期に行うとき、asyncawait を使います(C# 5以降)。

using System.IO;
using System.Threading.Tasks;

// async キーワードで非同期メソッドを定義
static async Task<string> ReadFileAsync(string path) {
    string content = await File.ReadAllTextAsync(path);
    return content;
}

await を付けた処理は「完了を待っている間、スレッドを解放して別の処理を進める」という動作になります。処理が完了すると await の次の行から再開します。

同期 vs 非同期の比較

同期非同期(async/await)
書き方の複雑さシンプルasync/awaitの理解が必要
待機中のスレッドブロックされる解放されて他の処理に使える
Webアプリのスループット低い(待機中もスレッドを占有)高い(待機中は別リクエストを処理できる)
向いている処理CPU処理・短時間の処理I/O処理(ファイル・HTTP・DB)

非同期処理の詳細はasync / awaitで解説しています。

null許容型とnull合体演算子

C#では、stringint などの型は通常 null を代入できません。null を許容するには型名の後に ? を付けます。

string name = null; // C# 8以降の警告あり(null許容参照型が有効な場合)
string? name2 = null; // 明示的にnullを許容

int count = null; // エラー: int は null を代入できない
int? count2 = null; // OK: nullable int

null合体演算子 ??

?? 演算子は、左辺が null のときだけ右辺の値を使います。

string? member = null;
string result = member ?? "item_b2";
Console.WriteLine(result); // item_b2
item_b2

null許容型の詳細はnullableで、null合体演算子の詳細はnull合体演算子で解説しています。

プロパティ

C#のクラスでは、フィールドに直接アクセスさせるのではなく、「プロパティ」を通じてアクセスさせる書き方が標準的です。

class Member {
    // プロパティ(get と set を持つ)
    public string Name { get; set; }
    public int Score { get; private set; } // 外部から書き込み不可

    public Member(string name, int coeff) {
        Name = name;
        Score = coeff;
    }
}

var member = new Member("item_a5", 225);
Console.WriteLine(member.Name); // item_a5
Console.WriteLine(member.Score); // 225

member.Name = "item_c4"; // OK
// member.Score = 300; // エラー: private set
item_a5
225

{ get; set; } のような書き方は「自動実装プロパティ」と呼ばれます。バッキングフィールドをコンパイラが自動生成します。

開発ツールとエコシステム

C#の主な開発ツールと、パッケージ管理の仕組みを整理します。

IDE — Visual Studio と Visual Studio Code

C#の開発で最も広く使われているIDEはVisual Studioです。Microsoft純正の統合開発環境で、コード補完・デバッガー・プロファイラー・テストランナーなどが一体になっています。Windows版はCommunity Edition(個人・小規模チーム向け)が無料で利用でき、C#開発に必要な機能が一通り揃っています。

軽量なエディタとしてはVisual Studio Code(VS Code)もC#の開発に対応しています。C# Dev Kit拡張機能をインストールすると、コード補完・デバッグ・テスト実行などの機能が利用できます。VS Codeはクロスプラットフォームで動作するため、LinuxやmacOSでC#を書く場合の選択肢になります。

IDE以外にも、JetBrains社のRider(有料)が高い人気を持っています。

NuGet — パッケージ管理

C#/.NETのパッケージ管理システムはNuGet(ニューゲット)です。JavaScriptのnpm、Pythonのpipに相当するもので、外部ライブラリのダウンロード・バージョン管理・依存関係の解決を行います。

dotnet add package Newtonsoft.Json

このコマンドで、JSON処理ライブラリであるNewtonsoft.Jsonがプロジェクトに追加されます。パッケージの情報はプロジェクトファイル(『.csproj』)に記録されるため、チームメンバーが同じパッケージを自動的にインストールできます。

dotnet CLI — コマンドラインツール

.NET SDKに含まれる『dotnet』コマンドは、プロジェクトの作成からビルド・テスト・実行・パッケージ管理まで幅広い操作をカバーしています。

コマンド説明
dotnet new consoleコンソールアプリケーションのプロジェクトを新規作成
dotnet buildプロジェクトをビルド
dotnet runビルドして実行
dotnet testテストを実行
dotnet add package [名前]NuGetパッケージを追加
dotnet publishデプロイ用にパッケージング

IDEを使わなくても、テキストエディタとターミナルだけでC#の開発ができる環境が整っています。

テストフレームワーク

C#には複数のテストフレームワークが用意されています。MSTest(Microsoft純正)、xUnit(.NETチーム内で広く使われている)、NUnit(JUnitの移植から発展)の3つが主要な選択肢です。いずれも『dotnet test』コマンドで実行でき、Visual StudioのテストエクスプローラーやCI/CD(継続的インテグレーション / 継続的デリバリー — コードの変更を自動的にビルド・テスト・デプロイする仕組み)パイプラインとも連携できます。

using Xunit;

public class CalculatorTest {
    [Fact]
    public void Add_TwoNumbers_ReturnsSum() {
        var result = 2 + 3;
        Assert.Equal(5, result);
    }
}

テストの書き方は言語の機能そのものではありませんが、実務でC#を使う場合にはほぼ確実に必要になる知識です。

よくあるエラーと解決方法

NullReferenceException — null参照エラー

最もよく発生するエラーのひとつです。null のオブジェクトのメソッドやプロパティにアクセスしようとすると発生します。

string name = null;
Console.WriteLine(name.Length); // NullReferenceException

解決策: アクセス前に null チェックを行う、またはnull条件演算子 ?. を使う。

string? name = null;

// null チェック
if (name != null) {
    Console.WriteLine(name.Length);
}

// null条件演算子(null なら null を返す)
Console.WriteLine(name?.Length);

IndexOutOfRangeException — 配列の範囲外アクセス

配列やリストの存在しないインデックスにアクセスすると発生します。

var names = new List<string> { "item_x", "item_y" };
Console.WriteLine(names[5]); // IndexOutOfRangeException

解決策: アクセス前に Count で要素数を確認する。

InvalidCastException — 型変換エラー

互換性のない型にキャストしようとすると発生します。

object obj = "item_a3";
int num = (int)obj; // InvalidCastException

解決策: is 演算子で型チェックしてからキャストする、または as 演算子でnullを返すキャストを使う。

object obj = "item_a3";

if (obj is string s) {
    Console.WriteLine(s.Length); // 安全
}

型チェックと変換の詳細はis / as / パターンマッチで解説しています。

コメントの書き方

C#でコメントを書くための記法です。コメントはコードの動作には影響せず、コードの意図を伝えたり、一時的に処理を無効化(コメントアウト)したりするために使います。

コメントの種類

種類書き方概要
一行コメント// テキスト『//』から行末までがコメントになります。コードの右側に補足を添えるときにも使います。
ブロックコメント/* テキスト */複数行にまたがるコメントを書く場合に使います。途中でネストはできません。
XMLドキュメントコメント/// テキスト『///』で始まる特殊なコメントです。クラス・メソッド・プロパティの直前に書き、IDEがドキュメントとして解析・表示します。

サンプル

3種類のコメントを使ったサンプルです。

// 一行コメント: // 以降、行末までがコメントになります。
int score = 100; // 行末コメント — コードの後ろに補足を書くときにも使います。

/*
  ブロックコメント: /* から */ までの範囲がコメントになります。
  複数行にわたる説明を書くときに使います。
*/

/// <summary>
/// XMLドキュメントコメント: /// で始まるコメントです。
/// クラス・メソッド・プロパティの直前に書きます。
/// </summary>
/// <param name="x">入力値</param>
/// <returns>計算結果</returns>
int Calculate(int x) {
	return x * 2;
}

コメントの内容は自由です。主な使い道としては「なぜこう書いたか」「何をしているか」「TODO」「メモ」などが挙げられますが、必要だと思った内容を自由に記載してしまって問題ありません。XMLドキュメントコメントのタグ一覧・判断基準・実務での慣習などの詳細はコメント解説ページで詳しく解説しています。

おすすめ学習順

C#を学ぶうえで、機能をどの順番で押さえれば効率よく進められるかをまとめました。各項目は辞典の該当ページへのリンクになっています。上から順に進めると、少ない前提知識で次の段階に進めるように並べています。

Step 1 — 環境構築と最初の一歩

まずはC#が動く環境を用意して、1行だけのプログラムを走らせるところから始めます。

Step 2 — 変数・基本型・演算子

値を保持する変数の宣言方法と、値を組み合わせる演算子を覚えます。

Step 3 — 制御構文(条件分岐とループ)

プログラムの流れを分岐させたり繰り返したりする構文です。ここを押さえると書けるプログラムの幅が一気に広がります。

Step 4 — 文字列操作

プログラムが扱うデータの中でも、文字列は特に頻出します。標準で用意された文字列メソッドを一通り見ておきます。

Step 5 — 数値と変換

文字列と数値を行き来したり、数学的な計算を行う機能です。

Step 6 — 配列とコレクション

複数の値をまとめて扱うためのデータ構造を学びます。C#では用途ごとに使い分けられるように複数のコレクションが用意されています。

Step 7 — 日付・時刻

業務アプリでもゲームでも、日付と時刻の扱いは避けて通れません。

Step 8 — クラスとオブジェクト指向

データと処理をひとまとめにする仕組みです。ここからC#らしさが強く出てきます。

Step 9 — null安全

C#で頻発する NullReferenceException を避けるための仕組みです。

Step 10 — 例外処理

予期しないエラーに備えるための構文です。

Step 11 — LINQ

コレクション操作をSQLのような統一構文で書ける、C#を代表する機能です。

Step 12 — ファイル・ディレクトリ操作

ファイル入出力は業務プログラムの基本です。短いテキストから大きなファイルまで用途別に使い分けます。

Step 13 — 非同期処理

ファイル・ネットワーク・DBなど、待ち時間が発生する処理を効率的に扱うための仕組みです。

Step 14 — Unity/ゲーム開発でよく使うAPI

C#をUnityでのゲーム開発に使う場合、次のAPI(Application Programming Interface — ソフトウェア同士がデータをやりとりするための窓口)が頻繁に登場します。Unityを使わない場合は飛ばしても問題ありません。

Step 1〜3だけでも「入力を受け取り、条件で分岐し、繰り返しながら出力する」プログラムが書けます。Web・業務・ゲームといった各分野のページはそれぞれ独立して参照できます。

概要

C#はAnders Hejlsbergさんが設計し、Microsoftが2002年にリリースした静的型付けのオブジェクト指向言語です。.NETプラットフォームの上で動作し、Webアプリケーション・Windowsデスクトップ・ゲーム開発(Unity)など幅広い用途に対応しています。

1990年代末のJavaライセンス紛争をきっかけに、C++・Java・Delphiの長所を融合させる目的で設計されました。2014年以降は.NETのオープンソース化とクロスプラットフォーム対応が進み、Windows以外の環境でも広く使われるようになっています。

コンパイルの流れは「.csファイル → cscコンパイラ → IL(中間コード) → CLR(JIT) → 機械語実行」です。ILはOS非依存のため、同じコードをWindows・Linux・macOSで動かせます。.NET 7以降ではAOT(事前コンパイル)も選択でき、起動速度が重要な用途にも対応しています。

C#の主要機能まとめ

静的型付け

  • 変数・引数・戻り値に型を明示する
  • var を使えば型推論が利く
  • null許容型(string?)で null安全を明示できる

コレクション

  • List<T> — 可変長の配列
  • Dictionary<TKey, TValue> — キーと値のペア
  • LINQ — コレクションを統一した構文でフィルタ・変換・集計

非同期・例外

  • async / await — I/O処理を非同期に行う
  • try-catch-finally — 例外をキャッチして安全に処理

C#を使うことで得られること

  • 型の不一致によるバグをコンパイル前に検出できる
  • IDEの補完が正確になり、プロパティ名の打ち間違いなどが減る
  • LINQによりコレクション操作が簡潔になる
  • Unityの開発スキルと直結する

C#を使うことで増えるもの

  • 型宣言の分だけ記述量が増える
  • コンパイルという工程が必要になる(ただしdotnet runで自動化される)
  • .NETエコシステムへの依存が生まれる

string / int / bool の基本型と List<T> を押さえるだけで、多くのプログラムが書けます。

C#を取り巻く現在の状況

C#は2002年の登場から20年以上が経過しましたが、Microsoftが.NETのオープンソース化とクロスプラットフォーム対応を推し進めたことで、Windows以外の環境でも活躍の場が広がっています。Unityのゲーム開発、ASP.NET CoreによるWebバックエンド、.NET MAUIによるモバイルアプリ開発など、カバーする領域は年々拡大しています。

設計者であるAnders Hejlsbergさんは、Turbo Pascal・Delphi・C#・TypeScriptという4つの言語処理系を手がけた人物です。C#の設計には、Hejlsbergさんが過去の言語で得た経験 — コンパイル速度の重要性、開発者体験(Developer Experience)の追求、実用性を最優先にする姿勢 — が色濃く反映されています。

C#が20年以上にわたって進化を続けられている背景には、「他の言語の良い部分を積極的に取り入れる」という柔軟な設計方針があります。LINQはSQLから、async/awaitはF#の非同期ワークフローから、パターンマッチングは関数型言語から — 良いアイデアの出自にこだわらず、C#の文脈で使いやすい形に再設計して取り込む姿勢が、この言語の特徴のひとつです。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。