C#(シーシャープ)は、Microsoftが開発したマルチパラダイムのプログラミング言語であり、2000年代初頭の登場以来、デスクトップアプリケーション、Webサービス、モバイルアプリ、ゲーム開発(Unity)、さらにはAIやクラウドネイティブな環境に至るまで、幅広い分野で活用されています。

C#の大きな特徴の一つは、その進化の速さと一貫性にあります。

特に近年では、.NETの統合に伴い、年に一度のメジャーアップデートが行われるサイクルが定着しました。

開発者にとって、プロジェクトで使用しているC#のバージョンがどのフレームワーク(.NET)や開発環境(Visual Studio)に対応しているかを把握することは、最新機能を活用し、保守性の高いコードを記述するために不可欠です。

本記事では、C#の誕生から最新バージョンまでの履歴、およびそれぞれのバージョンで導入された主要機能、そして.NETやVisual Studioとの対応関係を網羅的に解説します。

C#のバージョン管理とリリースの仕組み

C#のバージョンは、実行基盤である.NET(旧.NET Frameworkおよび.NET Core)、および統合開発環境であるVisual Studioのバージョンと密接に紐付いています。

かつてC#は数年おきに更新される不定期なリリースサイクルでしたが、現在は.NETのリリースに合わせて毎年11月に新バージョンが登場する形式に統一されました。

C#の進化を理解する上で重要なのは、言語仕様(C#)実行プラットフォーム(.NET)を区別することです。

新しいC#の機能を使用するには、その機能をサポートするコンパイラを含むVisual Studioのバージョン、およびターゲットとする.NET SDKが必要です。

最新のC# 13.0などは、最新の.NET 9環境で最大限のパフォーマンスを発揮するように設計されています。

C#・.NET・Visual Studio バージョン対応表

開発を始める前に、現在使用しているツールがどのC#バージョンをサポートしているかを確認する必要があります。

以下の表に、主要なバージョンの対応関係をまとめました。

C# バージョン対応 .NET バージョン対応 Visual Studio バージョン
C# 13.0.NET 9Visual Studio 2022 (v17.12)
C# 12.0.NET 8Visual Studio 2022 (v17.8)
C# 11.0.NET 7Visual Studio 2022 (v17.4)
C# 10.0.NET 6Visual Studio 2022 (v17.0)
C# 9.0.NET 5Visual Studio 2019 (v16.8)
C# 8.0.NET Core 3.x / .NET Standard 2.1Visual Studio 2019 (v16.3)
C# 7.3.NET Core 2.1 / .NET Framework 4.7.2Visual Studio 2017 (v15.7)
C# 6.0.NET Core 1.x / .NET Framework 4.6Visual Studio 2015
C# 5.0.NET Framework 4.5Visual Studio 2012
C# 4.0.NET Framework 4.0Visual Studio 2010
C# 3.0.NET Framework 3.0 / 3.5Visual Studio 2008
C# 2.0.NET Framework 2.0Visual Studio 2005
C# 1.0 / 1.2.NET Framework 1.0 / 1.1Visual Studio .NET 2002 / 2003

注意点として、.NET Framework環境では、C# 8.0以降の最新機能(特にランタイムの変更を伴うもの)の多くが公式にはサポートされていません。

最新の構文を利用するためには、.NET 5/6/7/8/9といったモダンな.NETランタイムへの移行が推奨されます。

各バージョンの主要機能と進化の歴史

C#は、バージョンを重ねるごとに「より簡潔に」「より安全に」「より高速に」コードを書けるよう進化してきました。

ここでは、各バージョンの転換点となった重要機能を詳しく解説します。

C# 1.0 ~ 2.0:言語の基礎とジェネリクスの導入

C# 1.0は、Javaの対抗馬として登場し、管理された(Managed)環境でのオブジェクト指向開発を可能にしました。

そしてC# 2.0において、現在の開発でも欠かせない「ジェネリクス(Generics)」が導入されました。

ジェネリクスにより、型安全性を維持しながらコレクション(ListやDictionary)を扱えるようになり、パフォーマンスとコードの再利用性が飛躍的に向上しました。

また、yield return を用いた反復子(Iterator)や、匿名メソッドもこの時期に登場しています。

C# 3.0:LINQによるデータ操作の革命

C#の歴史において、最も画期的なアップデートの一つがC# 3.0です。

ここで導入された「LINQ (Language Integrated Query)」は、配列やリスト、データベース、XMLなどの異なるデータソースに対して、共通の構文でクエリを発行することを可能にしました。

LINQを支えるための周辺機能として、以下の機能も同時に追加されました。

  • ラムダ式
  • 拡張メソッド
  • 匿名型
  • 型推論(var キーワード)
C#
using System;
using System.Collections.Generic;
using System.Linq;

// C# 3.0の主要機能:LINQとラムダ式の例
var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

// 偶数のみを抽出して2倍にする
var query = numbers
    .Where(n => n % 2 == 0)
    .Select(n => n * 2);

foreach (var n in query)
{
    Console.WriteLine(n);
}
実行結果
4
8
12
16
20

C# 4.0 ~ 5.0:動的型付けと非同期処理の標準化

C# 4.0では、COM相互運用や動的な言語との連携を目的とした dynamic 型が導入されました。

その後、C# 5.0では現在のモダンなC#開発における標準スタイルである「async / await」による非同期プログラミングが導入されました。

これにより、UIスレッドをブロックせずに重い処理を行ったり、スケーラブルなネットワーク通信を記述したりすることが極めて容易になりました。

C# 6.0 ~ 7.x:開発効率の向上とパターンマッチング

C# 6.0では、コンパイラが「Roslyn(ロズリン)」へと刷新され、コードをより短く書くための「糖衣構文(Syntactic Sugar)」が多く追加されました。

null 条件演算子(?.)や、文字列補間($"...")などは、今では日常的に使われる機能です。

C# 7.0から7.3にかけては、「パターンマッチング」「タプル(Tuple)」が大幅に強化されました。

これにより、複数の値を一つの変数として効率よく返したり、複雑な条件分岐を簡潔に記述したりできるようになりました。

C# 8.0:Null安全への大きな一歩

C# 8.0における最大の変更点は、「Null許容参照型(Nullable Reference Types)」の導入です。

これは、参照型(クラスなど)が null になる可能性があるかどうかをコンパイラがチェックする仕組みです。

C#
#nullable enable
string? name = null; // nullを許可する
string message = "Hello"; // nullを許可しない(デフォルト)

// nameがnullの可能性があるため、警告が出る
// Console.WriteLine(name.Length); 

if (name != null)
{
    Console.WriteLine(name.Length); // チェック済みなので安全
}

この機能により、ランタイムエラーの代表格である NullReferenceException を、ビルド時の警告として事前に防ぐことが可能になりました。

C# 9.0:レコード型とイミュータビリティ

C# 9.0では、データの保持に特化した新しい型である「レコード(record)」が導入されました。

レコードはデフォルトで不変(Immutable)なプロパティを持ち、値ベースの比較(Value-based equality)をサポートします。

C#
// C# 9.0 レコード型の定義
public record Person(string FirstName, string LastName);

var p1 = new Person("Taro", "Yamada");
var p2 = new Person("Taro", "Yamada");

// 値が同じなら true と判定される
Console.WriteLine(p1 == p2); // True

C# 10.0 ~ 11.0:ボイラープレートの削減

C# 10.0以降は、冗長なコードを削減するための機能が強化されています。

  • Global Using:プロジェクト全体で共通の using を一箇所にまとめられる。
  • File-scoped namespaces:名前空間の宣言によるインデントを一段階減らせる。
  • 生文字列リテラル(C# 11.0)""" で囲むことで、エスケープなしで複数行の文字列やJSONを記述できる。

C# 12.0:プライマリコンストラクタ

C# 12.0では、クラスや構造体の宣言時に直接引数を受け取れる「プライマリコンストラクタ」が導入されました。

これにより、コンストラクタからフィールドへの代入といった定型コードを省略できます。

C#
// C# 12.0 クラスのプライマリコンストラクタ
public class UserService(int id, string name)
{
    public void Display() => Console.WriteLine($"ID: {id}, Name: {name}");
}

var user = new UserService(1, "Alice");
user.Display();

C# 13.0:最新の最適化

C# 13.0(最新)では、パフォーマンスと柔軟性の向上が図られています。

  • params collectionsparams 引数に配列だけでなく ReadOnlySpan<T>IEnumerable<T> を指定可能になり、呼び出し時のメモリアロケーションを抑制できます。
  • lock オブジェクトの改善:新しい System.Threading.Lock クラスのサポートにより、スレッド同期がより効率化されました。

使用中のC#バージョンを確認・変更する方法

開発プロジェクトがどのC#バージョンを使用しているかを確認するには、プロジェクトファイル(.csproj)をチェックします。

バージョンの確認手順

  1. Visual Studioでプロジェクトを右クリックし、「プロジェクトファイル(.csproj)の編集」を選択します。
  2. <TargetFramework> プロパティを確認します。通常、SDKがそのターゲットフレームワークに対して最適な最新の言語バージョンを自動的に選択します(デフォルト設定)。
  3. 明示的に指定したい場合は、<LangVersion> タグを追加します。
XML
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net9.0</TargetFramework>
    <!-- 明示的に最新バージョンを指定する場合 -->
    <LangVersion>latest</LangVersion>
  </PropertyGroup>
</Project>

<LangVersion> に指定できる主な値:

  • default:ターゲットフレームワークに基づくデフォルト。
  • latest:インストールされているSDKがサポートする最新のメジャーバージョン。
  • preview:プレビュー版の機能を含む最新バージョン。
  • 13.0 などの具体的な数値。

バージョン選定のポイントと将来の展望

C#のバージョンを選ぶ際は、まずプロジェクトのターゲットとなる.NETのサポート期間を考慮すべきです。

.NETには「LTS(長期サポート)」と「STS(標準サポート、旧称:Current)」の2種類があります。

  • LTS(Long Term Support):.NET 6や.NET 8など。3年間のサポートが保証されており、業務システムなどの長期運用プロジェクトに適しています。
  • STS(Standard Term Support):.NET 7や.NET 9など。最新の機能をいち早く取り入れたいプロジェクトに適していますが、サポート期間は1.5年と短めです。

今後のC#は、さらなる「パフォーマンスの向上」と「AI開発への親和性」を軸に進化していくと考えられています。

特にAIエージェントやクラウドネイティブなマイクロサービス開発において、メモリ消費を極限まで抑える Span<T>Native AOT(Ahead-Of-Timeコンパイル)に関連する機能拡張が続いています。

まとめ

C#は、登場から20年以上の歴史を持ちながら、常に時代のニーズを取り入れ、モダンな言語としての地位を維持し続けています。

C# 1.0の基本概念から始まり、LINQ、async/await、Null許容参照型、そして最新のC# 13に至るまで、その進化の根底には「開発者の生産性とコードの堅牢性を同時に高める」という一貫した哲学があります。

最新のC#を活用することは、単に便利な書き方を取り入れるだけでなく、より高速で安全なアプリケーションを構築することに直結します。

Visual Studio 2022と.NET 9を組み合わせることで、最新のC# 13が提供する強力な機能をフルに活用できます。

現在開発中のプロジェクトにおいても、対応表を参考に最適なバージョンを選択し、C#が提供する最新の表現力をぜひ体験してみてください。

言語の進化に追従することは、エンジニアとしてのスキルセットを更新し続けるための最良の手段となるはずです。