本文へスキップ
ウェブエンジニア問題集
第1章

C#とは何か — .NETで動く言語の特徴と使いどころ

約13分
この章の目次開く

C#(シーシャープ)は、Microsoftが開発した汎用のプログラミング言語です。2000年に登場し、静的な型システムとクラスベースのオブジェクト指向を中心に据えています。

「業務システムの言語」という印象を持たれがちですが、実際にはWeb API、CLIツール、デスクトップアプリ、モバイルアプリ、そしてUnityによるゲーム開発まで、かなり広い範囲で使われています。現在のC#はWindows専用ではなく、macOSやLinuxでも同じように動きます。

学習者学習者

C#って、Visual StudioでWindowsアプリを作る言語というイメージがあります。Macでも書けるんですか?

先生先生

昔はほぼその通りだったんだ。でも2016年以降のC#はクロスプラットフォームで、macOSでもLinuxでも、VS Codeでも書けるようになったよ。

C#と.NETは何が違うのか

C#を学び始めると、.NET、CLR、NuGet といった言葉が一気に出てきます。最初にここを整理しておくと、後の章で迷いません。

C#は「言語」、.NETは「C#で書いたコードを動かす実行環境と標準ライブラリ」です。
用語正体役割
C#プログラミング言語文法そのもの。型・クラス・LINQなどの書き方を定める
.NET実行環境 + 標準ライブラリC#のコードを実際に動かす基盤。旧称 .NET Core
CLR.NETに含まれる仮想マシン中間言語を機械語に変換して実行する。メモリ管理(GC)も担当
クラスライブラリ.NETに含まれる標準APIstring / List<T> / File / HttpClient など
NuGetパッケージ管理の仕組み外部ライブラリの入手。npmにあたるもの
.NET SDK開発ツール一式ビルド・実行・テストを行う dotnet コマンドを含む

JavaScriptで例えるなら、C#がJavaScript、.NETがNode.js+標準モジュール、NuGetがnpmにあたります。言語だけでは何もできず、実行環境とセットで初めて動く、という関係も同じです。

ソースコードが実行されるまで

C#のソースコードは、いきなりCPU向けの機械語になるわけではありません。いったんIL(中間言語)という共通の形式にコンパイルされ、実行時にその場のCPU向けの機械語へ変換されます。

このILへの変換を行うのがC#コンパイラ、ILを機械語に変換して実行するのがCLRです。

C#のビルド成果物はOS固有の機械語ではなくILなので、同じビルド結果をWindows・macOS・Linuxで動かせます。

C#で何が作れるのか

C#は「.NETの上で動く」ため、.NETがサポートする領域がそのままC#の守備範囲になります。

作れるもの使う技術補足
Web API・WebアプリASP.NET Core実務で最も需要が大きい領域
ブラウザで動くUIBlazorWebAssemblyでC#をブラウザ上で実行する
デスクトップアプリWPF / WinUI / AvaloniaAvaloniaはクロスプラットフォーム対応
モバイルアプリ.NET MAUIiOS / Android を1つのコードから
ゲームUnityUnityのスクリプトは基本的にC#
CLIツール・バッチ処理コンソールアプリdotnet run だけで動かせる
クラウドの関数Azure Functions / AWS Lambdaイベント駆動の小さな処理
用途を選ぶイメージ
C#は「1つの言語で守備範囲が広い」タイプの言語です

この本では、これらすべてを扱うのではなく、どの用途でも共通して必要になる「言語としてのC#」に絞って学びます。ASP.NET CoreやUnityに進むとき、結局つまずくのは型・クラス・LINQ・非同期処理といった言語の基礎だからです。

JavaScript・TypeScriptとの違い

このサイトの読者にはJavaScriptやTypeScriptから入った方が多いので、その視点で違いを整理しておきます。書き方の見た目はTypeScriptとよく似ていますが、根っこの考え方が違う部分があります。

項目C#TypeScript
型が存在する期間ビルド後も実行時に残るビルド時に消える
型チェックのタイミングビルド時 + 実行時ビルド時のみ
実行環境.NET(CLR)Node.js / ブラウザ
パッケージ管理NuGetnpm
クラスの位置づけ言語の中心。ほぼ必ず使う使えるが必須ではない
非同期処理async / await(Task)async / await(Promise)
nullの扱いNullable参照型(string?)strictNullChecks
ファイルとモジュール名前空間(namespace)で整理ファイル単位のimport / export
学習者学習者

「型が実行時にも残る」って、具体的に何が変わるんですか?

TypeScriptの型はコンパイル時にすべて削除され、実行されるのはただのJavaScriptです。そのため実行中に「この値は本当に User 型か」を型情報から判断することはできません。

C#の型はビルド後もILの中に残り、実行時にも参照できます。この違いが、ジェネリクスの挙動(List<int> と List<string> は実行時にも別物として扱われる)、DIコンテナが型を見て依存を解決できること、JSONのシリアライズが型情報だけで動くことなどにつながっています。ジェネリクスについては C#のジェネリクス で詳しく扱います。

.NETのバージョンとC#のバージョンの関係

C#のバージョン(C# 12、C# 13 …)は、.NETのバージョンとセットで進みます。基本的に使っている.NETのバージョンが、使えるC#の文法を決めると考えて問題ありません。

.NETのリリースには2種類あります。

種類サポート期間選ぶ場面
LTS(長期サポート)約3年業務システム・長く運用するサービス
STS(標準サポート)約1年半新機能を早く試したい場合・短命なツール
新規プロジェクトでは、迷ったらLTS(偶数バージョン)を選ぶのが基本です。

具体的なバージョン番号やサポート終了日は定期的に変わるため、着手時点で.NET のサポートポリシーを確認してください。

最初のC#コードを読む

C#の「Hello, World」は、今ではこれだけで動きます。

Console.WriteLine("Hello, C#");
csharp

これはトップレベルステートメントという書き方で、C# 9以降で使えます。以前は次のように書く必要がありました。

using System;
 
namespace HelloApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, C#");
        }
    }
}
csharp
先生先生

古い記事に出てくるのはたいてい下の書き方だけど、意味は同じ。コンパイラが上の書き方を下の形に組み立て直してくれているんだ。

Console.WriteLine は、標準出力に値と改行を書き出すメソッドです。この本では、メソッドを紹介するときに構文・引数・戻り値をセットで示していきます。

構文: Console.WriteLine(value?)

引数渡せるもの説明
value(第1引数)文字列 / 数値 / 任意のオブジェクト出力したい値。省略すると改行だけを出力する

戻り値: なし(void)

任意のオブジェクトを渡した場合は、その型の ToString() の結果が出力されます。改行を付けたくない場合は Console.Write を使います。

よくあるハマりどころ

「C#はWindows専用」だと思って選択肢から外す

現在の.NETはmacOS・LinuxでもWindowsと同じように動き、DockerコンテナやLinuxサーバーへのデプロイも一般的です。「Windowsサーバーが必要になるから」という理由で候補から外す判断は、今は成り立ちません。

検索結果が .NET Framework 時代の情報だった

C#は歴史が長く、蓄積された記事も膨大です。そのぶん現在では推奨されない書き方の記事が上位に残っていることがよくあります。WebForms、app.config、packages.config といった単語が出てきたら、かなり古い情報の可能性が高いと考えてください。

学習者学習者

つい上から順に読んでしまうんですが、新しいかどうかはどこで見分けたらいいですか?

いちばん確実なのは、公式のC# ドキュメントを先に開くことです。公式ドキュメントはバージョンごとに整理されており、新旧の書き方が併記されている場合も「どちらが現在の推奨か」が明記されています。

Visual Studio と Visual Studio Code を混同する

名前は似ていますが別の製品です。Visual StudioはWindows向けの統合開発環境で機能が豊富、Visual Studio Codeは軽量なエディタで、拡張機能を入れてC#開発に使います。macOSやLinuxで学び始めるなら、後者で十分です。

「クラスを書かないと動かない」と身構える

トップレベルステートメントのおかげで、学習中の小さなコードはクラスなしで書けます。まずは1ファイルで動かして文法に慣れ、クラスの設計は C#のクラスとオブジェクト で改めて扱います。

ちゃんと使うためのポイント

  • C#は言語、.NETは実行環境と標準ライブラリ。両者はセットで動く
  • C#のコードはILにコンパイルされ、実行時にJITで機械語に変換される
  • 現在のC#はクロスプラットフォーム。Windows専用なのは旧系統の .NET Framework
  • TypeScriptと見た目は似ているが、型が実行時にも残る点が根本的に違う
  • 新規開発ではLTS(長期サポート)の.NETを選ぶ
  • 古い記事に当たったら、まず公式ドキュメントで現在の書き方を確認する

次の章では、実際に.NET SDKをインストールし、dotnet new と dotnet run で最初のプロジェクトを動かすところまで進みます。

参考リンク