.NETってなに？基礎から学ぶ開発プラットフォーム

# はじめに
これまでの業務でC#を使用してきて「.NET」という単語は耳にしていましたが、「.NETって何？」「C#とどんな関係があるの？」とわからない部分が多かったため、調べてまとめてみました。
.NET初心者の方向けに分かりやすく解説していきます。

# .NETってなに？
「.NET」とは、Microsoftが開発したアプリケーション開発プラットフォームです。Windowsだけでなく、複数のOSで動作するクロスプラットフォームの仕組みとなっています。

### 主な特徴とメリット
.NETの主な特徴とそのメリットを以下にまとめてみました。<br>

<dl>
  <dt>クロスプラットフォーム対応</dt>
  <dd>
  
  **特徴**：上でも触れましたが、現在の.NETはクロスプラットフォームに対応しており、Windowsだけでなく、Linux、macOS、Android、iOSでも動作します。<br>
  **メリット**：複数のプラットフォームをターゲットにした開発が可能になり、一度書いたコードを多くの環境で実行できます。
  </dd>
  <br>
  <dt>多言語対応</dt>
  <dd>
  
  **特徴**：複数言語に対応しており、主にC#、F#、VB.NETなどを使っての開発が可能です。<br>
  **メリット**：複数の言語間での互換性を保てるため、言語間の移行がスムーズになります。
</dd>
  <br>
  <dt>高パフォーマンス</dt>
  <dd>
  
  **特徴**：JIT（Just-In-Time）コンパイルにより最適化され、高速に動作します。<br>
**メリット**：サーバーサイドの処理や大量のデータを扱うようなパフォーマンスが重要なシステムで力を発揮します。</dd>
</dl>

*****
### デメリット
.NETには多くのメリットがある反面、デメリットもあります。
<dl>
  <dt>ランタイム依存</dt>
  <dd>
.NETアプリケーションは、実行時に.NETランタイム（実行環境）が必要です。
ユーザーのPCに.NETランタイムがない場合は動作しないため、インストールする必要があります。
  </dd>
  <br>
<dt>オープン性に劣る</dt>
  <dd>
.NETはオープンソースとして公開されていますが、開発の方向性などの決定権はMicrosoftにあります。<br>
そのため、システムの変更や終了などのリスクがあり、「今後も安心して使えるか？」という長期的な技術選定への不安要素となり得ます。
  </dd>
</dl>



*****
### 何が作れるの？
.NETは複数のプログラミング言語に対応していることや、拡張性が高いことから様々な開発に使用されています。主な使用例は以下です。
**・Webアプリケーション
・デスクトップアプリ
・モバイルアプリ
・クラウドアプリ
・ゲーム**
*****
### .NETの進化
.NETについて調べていく中で、「".NET" と ".NET Framework" と ".NET Core"って何が違うの？」と疑問に思ったのでこちらで少し説明していきます。
<dl>
  <dt>①.NET Framework</dt>
  <dd>まず初めに生まれたのが、「.NET Framework」です。<br>
  2002年にリリースされ、2022年までの間バージョンアップを重ねてきました。<br>
  こちらはWindows専用で、マルチプラットフォームには非対応となっています。
  </dd>
  <br>
  <dt>②.NET Core</dt>
  <dd>「.NET Core」は2016年にリリースされました。<br>
  従来の「.NET Framework」とは別物として開発されており、ここでマルチプラットフォーム（Windows / Linux / macOS）への対応が可能になりました。</dd>
  <br>
  <dt>③.NET</dt>
  <dd>2020年には既存の「.NET Framework」と「.NET Core」を統合し、「.NET 5」がリリースされました。以降は、「.NET + バージョン番号」でバージョンアップされています。<br>
  現在は.NET 9までリリースされています。</dd>
</dl>

:::note info
「.NET Core」は現行の「.NET」に統合されましたが、
「.NET Framework」は今も現役で動いています。
（将来的にはすべて「.NET」に移行される予定です。）
:::

# .NETの構成要素
.NETの構成要素は大きく分けて以下の4つです。
  <dt>①共通言語仕様（CLS）</dt>
  <dd>CLS（Common Language Specification）とは、.NETでの多言語での開発をサポートする言語間の共通ルールのことです。<br>
  .NETではC#、F#、VB.NETなどの複数言語での開発が可能なため、ルールを決めておくことによって各言語の互換性を保っています。
  </dd>
  <br>
  <dt>②共通言語ランタイム（CLR）</dt>
  <dd>.NETはCLR（Common Language Runtime）上で動作します。<br>
  CLRとは、.NETアプリケーションを実行するための仮想マシンのことで、コードを中間言語にコンパイルしてから実行します。<br>
  一度共通の中間言語にコンパイルされることによって、プログラミング言語に依存しない開発や実行が可能になります。</dd>
　<dt>③基本クラスライブラリ（BCL）</dt>
  <dd>BCL（Base Class Library）とは、.NETアプリケーションで使える標準のライブラリ群のことで、DB操作、通信、ファイルI/O、文字列操作、通信などの標準部品として使用できる機能が準備されています。</dd>
　<dt>④アプリケーションフレームワーク</dt>
  <dd>.NETでは以下のように用途に応じて複数のアプリケーションフレームワークが用意されています。<br>
  
| フレームワーク | 用途 |
|:-----------|------------:|
| ASP.NET      | Webサイト、WebAPI    |
| Blazor         | Web UI         |
| Windows Forms    | デスクトップアプリ      |
| WPF（Windows Presentation Foundation）       | 高機能デスクトップアプリ|
| .NET MAUI（Multi-platform App UI）     | クロスプラットフォームアプリ     |
| Console App    | バッチ処理、ツール作成    |
| Unity  |   ゲーム開発　　　　　|
  </dd>

# C#と.NETの関係性
.NETの概要をつかんだところで、C#と.NETの関係性について考えていきます。
これまで自分は「C#＝.NET」という認識でいましたが、そうではありません。
上で説明してきたとおり、
**C# ＝ プログラミング言語**であり、**.NET ＝ 開発プラットフォーム**です。

ただ、もともとC#はMicrosoftが.NET上で使うことを想定して作った言語であるため、
普通通り開発を行う場合は **C#.NET（.NET上で動くC#プログラム）** の環境になります。

概念として、**C# ＝ C#.NET ではない**が、C#と言ったらほぼほぼ**C#.NET**だと考えて問題ないと思われます。

# 最後に
ここまで、.NETの概要とC#との関係性について説明してきました。
.NETを学ぶことで、さまざまな開発分野に対応できるスキルを身につけることができ、クロスプラットフォーム対応のアプリ開発やクラウド技術、ゲーム開発など、多岐にわたる分野で生かすことができます。
この記事が自分と同じような「そもそも.NETってなに？」というような疑問を抱えている方の助けになれば幸いです！

# 参考文献
http://learn.microsoft.com/ja-jp/dotnet/standard/glossary

https://learn.microsoft.com/ja-jp/training/modules/dotnet-introduction/

https://aws.amazon.com/jp/what-is/net/