C#(「シーシャープ」と読みます)は、Anders Hejlsberg率いるチームがMicrosoftで設計し、2002年に最初にリリースされた汎用プログラミング言語です。静的型付け(すべての変数に、プログラムの実行前にコンパイラが確認する型がある)で、オブジェクト指向(コードをクラスにまとめる)で、マネージド(ガベージコレクターがメモリを解放してくれる)な言語です。現代のC#は関数型プログラミングからも多くを取り入れていて、ラムダ、LINQクエリ、パターンマッチング、不変のレコードがあります。
これは完全なC#のプログラムです。Runを押してください。
出力:
Hello, Ada! It is 2026.
C#の用途
C#は汎用言語なので、ほとんどの種類のソフトウェアで使われていますが、その大部分はいくつかの分野が占めています。
- ゲーム。 最も広く使われているゲームエンジンの1つであるUnityは、C#でスクリプトを書きます。Godotもサポートしています。
- Webのバックエンド。 ASP.NET Coreは、API、Webサイト、リアルタイムアプリのための.NETのWebフレームワークです。公開ベンチマークでは、主流のWebフレームワークの中で最も高速なものの1つです。
- デスクトップアプリ。 WindowsではWPFとWindows Forms、クロスプラットフォームでは.NET MAUIとAvaloniaです。
- クラウドとサービス。 Azure Functions、バックグラウンドワーカー、コンテナ上のマイクロサービスです。
- ツールと自動化。 コマンドラインツール、ビルドスクリプト、データ処理です。
Microsoftの技術で動いている大企業やゲームスタジオでは特によく使われています。モバイルアプリも.NET MAUI(Xamarinの後継)で作れますが、KotlinやSwiftに比べると小さな分野です。
C#と.NETは同じものではない
C#は言語です。.NETはそれを動かすプラットフォームで、3つの部分からなります。
- ランタイム(CLR)。 C#のコンパイラはマシンコードを生成しません。
.dllや.exeファイルに格納される中間言語(IL)を生成します。プログラムの実行時に、共通言語ランタイムがそのILをジャストインタイム(JIT)でネイティブコードにコンパイルし、ガベージコレクターでメモリを管理し、型安全性を強制します。 - 基本クラスライブラリ。 コレクション、ファイルアクセス、ネットワーク、テキスト、日付、スレッドなど、
System.*の下にあるすべてです。 - SDK。 プロジェクトの作成、ビルド、テスト、実行を行う
dotnetコマンドです。
他の言語(F#、Visual Basic)も同じILにコンパイルされるので、C#のプログラムはF#で書かれたライブラリを使えます。
プラットフォームには2つの世代があります。.NET Framework(2002年の1.0から4.8.1まで)はWindows専用で、今も多くの古いアプリケーションを動かしています。.NET(バージョン5までは.NET Coreと呼ばれていました)は、Windows、Linux、macOSで動く、オープンソースでクロスプラットフォームの後継です。新しい開発は.NETを対象にします。.NET 8や.NET 10のような偶数番号のリリースには、3年間の長期サポートがあります。
C#のプログラムの構成
C#のプログラムは、メンバー(フィールド、プロパティ、メソッド)を含む型(クラス、構造体、インターフェース、enum、レコード)でできています。実行は Main という名前の静的メソッドから始まります。名前空間は関連する型をまとめ、using ディレクティブを使うと短い名前でそれらを参照できます。
出力:
Maya: 21.00
Leo: 13.00
すでにいくつかのことが見て取れます。Order は2つのプロパティ(Customer、Total)、コンストラクター、メソッドを持つクラスです。decimal はお金のための型で、m の接尾辞はdecimalのリテラルを表します。var を使うとコンパイラがローカル変数の型を推論し、List<Order> は Order オブジェクトだけを受け付けるジェネリックなコレクションです。$"..." の中の {order.Total:F2} は、数値を小数点以下2桁で書式設定します。
実際のプロジェクトでは、通常は各クラスがそれぞれのファイルに置かれ、ファイルはまとめて1つのアセンブリにコンパイルされます。詳しくはクラスとオブジェクトを参照してください。
静的型付けの実際
コンパイラはすべての式の型を知っているので、多くの種類の間違いが、実行中のプログラムに届く前に止められます。int に文字列を代入する、存在しないメソッドを呼ぶ、引数を間違った順序で渡すといったことは、その行を指すエラーとともにコンパイル時に失敗します。
出力:
29.97
45
型はエディターも支えています。ツールはコンパイラと同じ型情報を読むので、C#では自動補完、名前の変更、「すべての参照を検索」が正確に動きます。
C#のバージョンと追加された機能
2020年のC# 9以降、新しいバージョンは毎年11月に新しい.NETのリリースと一緒に出ています。それ以前は2年から3年ごとでした。各バージョンは既存のコードがコンパイルできるように設計されていて、まれな例外(C# 14でプロパティのアクセサーの中の field がキーワードになったことなど)は破壊的変更として文書化されているので、C# 2向けに書かれたプログラムは今でもほぼ必ずそのままコンパイルできます。
| バージョン | 年 | 主な追加機能 |
|---|---|---|
| C# 2 | 2005 | ジェネリック、null許容値型(int?)、イテレーター(yield) |
| C# 3 | 2007 | LINQ、ラムダ式、var、オブジェクト初期化子、拡張メソッド |
| C# 4 | 2010 | dynamic、省略可能な引数と名前付き引数 |
| C# 5 | 2012 | async と await |
| C# 6 | 2015 | 文字列補間 $"..."、nameof、null条件演算子 ?. |
| C# 7 | 2017 | タプル、out var、is によるパターンマッチング、桁区切り文字 |
| C# 8 | 2019 | null許容参照型、switch式、範囲 s[1..4]、??=、非同期ストリーム |
| C# 9 | 2020 | レコード、init アクセサー、トップレベルステートメント、ターゲット型の new() |
| C# 10 | 2021 | グローバルusing、ファイルスコープの名前空間、レコード構造体 |
| C# 11 | 2022 | 生文字列リテラル """、required メンバー、リストパターン |
| C# 12 | 2023 | クラスのプライマリコンストラクター、コレクション式 [1, 2, 3] |
| C# 13 | 2024 | params コレクション、System.Threading.Lock 型 |
| C# 14 | 2025 | 拡張メンバー、プロパティの field キーワード |
新しいバージョンは主に形式的な記述を減らしています。次のC# 9以降のプログラムは、トップレベルステートメント(class Program も Main もない)、レコード、switch式を使っています。
// C# 9 and later, in a .NET 6+ project (implicit usings import System)
var order = new Order("Maya", 21.00m);
Console.WriteLine(Shipping(order));
static string Shipping(Order o) => o.Total switch
{
>= 50m => "free shipping",
>= 20m => "standard shipping",
_ => "shipping fee applies"
};
record Order(string Customer, decimal Total);
同じ論理を古い明示的なスタイルで書いたものは、C# 6以降のすべてのバージョンでコンパイルできます。
出力:
standard shipping
どちらの形も正しいC#です。既存のコード、チュートリアル、Unityのプロジェクトでは古い明示的なスタイルに、新しい.NETのプロジェクトでは短いスタイルに出会います。
LINQ:言語の中でデータを問い合わせる
LINQ(Language Integrated Query、C# 3)は、C#を好む理由として多くの人が挙げる機能の1つです。メソッドの連鎖で、どんなコレクションでも絞り込み、並べ替え、グループ化、変換ができます。
出力:
95, 91, 88, 72
Average: 78.0
Best: 95
同じ構文が、メモリ上のリストにも、Entity Frameworkを通したデータベースのテーブルにも、XMLにも使えます。詳しくはLINQを参照してください。
C#は最初の言語に向いているか
C#はPythonより最初に求めるものが多い言語です。型を宣言し、文をセミコロンで終え、コードをクラスの中に書きます。その代わり、コンパイラが間違いを早く見つけ、ツール(Visual Studio、VS Code、Rider)は優秀で、概念はJava、TypeScript、Kotlin、C++にそのまま応用できます。Unityでゲームを作りたい場合や、.NETの会社で働きたい場合は、当然の選択です。データ分析や機械学習が目標なら、Pythonのほうがエコシステムが大きいです。
始めるには、.NET SDKをインストールして dotnet new console を実行するか、Hello Worldから始めて、これらのページの例を直接実行してみてください。
よくある質問
C#とは何ですか?
C#(「シーシャープ」と読みます)は、Microsoftで作られ、2002年に最初にリリースされた、静的型付けでオブジェクト指向の汎用プログラミング言語です。ソースコードは中間言語にコンパイルされ、.NETランタイムがそれをマシンコードに変換し、メモリはガベージコレクションで管理されます。Webのバックエンド、Unityのゲーム、デスクトップアプリ、クラウドサービス、ツールに使われています。
C#と.NETは同じものですか?
違います。C#は言語で、.NETはそれが動くプラットフォームです。ランタイム(CLR)、基本クラスライブラリ(System.Collections.Generic、System.IO など)、SDKのツールで構成されます。F#やVisual Basicも.NETの上で動き、C#のバージョンは通常.NETのバージョンと一緒にリリースされます(たとえばC# 12は.NET 8と一緒です)。
C#は何に使われていますか?
ASP.NET CoreによるWeb APIやWebサイト、Unityによるゲーム(Unityのスクリプト言語はC#です)、WPFやWinFormsによるWindowsのデスクトップアプリ、.NET MAUIによるクロスプラットフォームのアプリ、クラウドサービスやAzure Functions、コマンドラインツールです。企業向けのソフトウェアやゲームスタジオでよく使われています。
C#は習得が難しいですか?
最初の言語としては中程度です。構文はCスタイルで、すべての変数にコンパイラが確認する型があるのでPythonより厳密ですが、メモリは自動で管理され、エラーメッセージもわかりやすいです。ほとんどの初心者は、数週間練習すれば役に立つコンソールプログラムを書けるようになります。
C#は今でも学ぶ価値がありますか?
あります。C#は開発者調査で常に最もよく使われる言語の1つに入り、.NETはオープンソースでクロスプラットフォームであり、言語には毎年11月に新しいバージョンが出ます。Unityでゲームを作りたい場合や、Microsoftの技術で成り立つ会社で働きたい場合には、現実的な選択肢です。