🦔

C#/.NETのすすめ

2024/09/11に公開

C#とは?

無料のクロスプラットフォーム環境である.NETプラットフォームで最も多く使われる言語です。
C#はクラウド、デスクトップ、IoT、サーバー、モバイルなどさまざまなデバイス、Windows、Linux、iOS、Android、MacOSといったさまざまなOSで動作するアプリを作成できます。

.NETとは?

Webアプリケーション、コンソールアプリケーション、モバイルアプリケーション、デスクトップアプリケーションなどさまざまな種類のアプリケーションを開発するためのオープンソースフレームワークです。
.NETで最も一般的な言語がC#です。他にもVisual BasicやF#などで使用可能です。
OpenTelemetryやgRPCといった業界標準な実装が重視されておりこれらの実装が容易になっています。

C#はレガシー言語か?

No
C#は常に革新的な言語機能を提供しつつけています。
例えば、現代的なプログラミング言語では当たり前になったLINQはC#ではC#3.0の機能として2007年11月に取り入られています。
例えば、async/awaitはC#5.0の機能として2012年8月に取り入られています。
このように現代的な言語では当たり前になった機能はいち早くC#が実装しています。

以降、.NETとC#は不可分のものとして話を進めていきます。

パフォーマンス

https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-8/?WT.mc_id=%3Fwt.mc_id%3DDT-MVP-5004827
毎年、Performance Improvements in .NET Xという超長文ブログ記事が上がってきます。例えば、.NET 8ではJITの改善でDynamic PGOに関するところが一番のトピックでした。
クラウドアプリケーションではそのパフォーマンスは課金に直結します。パフォーマンスに優れるフレームワークであったり言語を使用することはそれだけサイジングを小さくできお金を節約できます。
また、電力を節約することにもつながりますので地球環境を守ることにもつながっていきます。

https://www.techempower.com/benchmarks/#section=data-r21&hw=ph&test=plaintext

開発環境

C#/.NETの開発環境と言えばまず思い浮かぶのはVisual Studioです。例えば、Windowsで開発するのであればまず第一選択肢はVisual Studio 2022ということになると思います。
インストールも容易で開発に着手するまでのハードルがとても低いといえます。
LinuxであったりMacOSだとするならば、Visual Studio CodeやJetBrains社のRiderという統合開発環境がとても便利です。
いずれも、.NET SDKの提供するRoslynによってコンパイラーのコンパイル結果とIDE上のコード分析閣下が異なることがないのが.NETの良さです。

NuGet

NuGetパッケージマネージャーは大規模なエコシステムです。
ここからライブラリーを組み込むことで既存のライブラリー資産を活用することができます。

Generic Host

.NETの素晴らしい機能の一つとしてGeneric Host(汎用ホスト)が上げられる。
Generic HostはコンソールアプリをはじめとしてWebアプリでは標準ですし、WPFでもGeneric Hostの使用は推奨事項です。また、.NET MAUIでも採用されています。
主な機能としては

  • 依存関係の挿入(DI)
  • ログ
  • 構成
  • グレースフルシャットダウン

などです。

特に、DI(サービス)機構が強力です。

たとえば、ASP.NET CoreにおいてもともとBlazorのプロジェクトだったところにWebAPIの機能も追加したいということはよくある話です。
そうしたときにはGeneric HostにWebAPIのサービスを追加してミドルウェアを追加することで使用する準備が整います。
https://learn.microsoft.com/aspnet/core/fundamentals/apis?view=aspnetcore-8.0&WT.mc_id=%3Fwt.mc_id%3DDT-MVP-5004827

https://learn.microsoft.com/aspnet/core/fundamentals/middleware/?view=aspnetcore-8.0&WT.mc_id=%3Fwt.mc_id%3DDT-MVP-5004827

ミドルウェアの話が出ましたので、
静的ファイルを使用したい場合は静的ファイルを提供するミドルウェアを
認証をしたい場合は認証を提供するミドルウェアを
認可をしたい場合は認可を提供するミドルウェアを
....

のように使用したい機能に応じてミドルウェアを選択できます。
それらが組み込みで用意されています。

Blazor

ASP.NET Coreの最もモダンなWebフレームワークで単一のプログラミングモデルでサーバーサイドのレンダリングとクライアントサイドのレンダリングの両方をサポートしています。また、ページ単位でその切替もできます。

特徴としては、C#でクライアント側のロジックとサーバー側のロジックを共有することができます。すなわち、同一の言語でサーバーとクライアント側を実装できるので型共有も可能ということになります。

.NETのこれまでのライブラリー資産を生かした開発ができます。

WindowsやLinux、MacOS上でVisual StudioであったりVisual Studio CodeやRiderなどの開発環境で開発できWindowsやLinuxなどにデプロイできます。もちろん、コンテナ化して可搬性を考慮した設計も可能です。

特徴

Blazorの最大の特徴はRazorコンポーネントといわれるUI要素の.NETクラスです。
C#コードにHTMLのマークアップを結合させたものでUIのレンダリングロジックを定義したりユーザーイベント例えば、ボタンを押したときの処理を定義したりというものです。
最大の特徴はそのRazorコンポーネントを入れ子にしたり再利用したりすることが可能な点です。これによって生産性が高まっています。

Blazor Hybrid

BlazorというWebのテクノロジーを利用したネイティブアプリケーションです。
Blazor HybridアプリのRazorコンポーネントはネイティブアプリ内で他の.NETコンポーネントと一緒に実行されてHTMLとCSSに基づくUIをWeb Viewコントロールにレンダリングします。
Blazor Hybridは.NET MAUI、WPF、Windows Formなどのさまざまなアプリで構築できます。

Orleans

Orleansは堅牢でスケーラブルな分散アプリを構築するためのクロスプラットフォームフレームワークです。
単一のオンプレミスサーバーからクラウド内の数千の分散された高可用性アプリにまでスケールします。
K8SやApp Serviceなどにデプロイできます。

適用範囲

大規模にスケールする.NETアプリはOrleansの使用を考慮します。
Microsoftでも様々な内部サービスに使用されています。

.NET Aspire

.NET Aspireは監視可能で運用環境に対応したクラウド対応のアプリケーションを構築するためのサービススタックです。クラウドネイティブアプリケーションは通常データベース、ストレージ、キャッシュ、AIなど多数のサービスを使用します。このためにスケーラビリティ、レジリエンス、管理性を確保するため考慮事項がたくさんあります。これらを一貫性あるツールと設定のセットを提供し開発効率の向上を支援します。

オーケストレーション

.NET Aspireのオーケストレーションはクラウドネイティブアプリケーションの構成と相互接続の管理を簡略化します。
特に、サービス検出と接続文字列の管理は環境によって変化する接続文字列の管理を容易にします。

ダッシュボード

開発中はプロジェクトを起動するとダッシュボードが自動的に起動します。
アプリからOpenTelemetryデータを受信して独自のUIで各種ログを表示します。
ダッシュボードはMicrosoftの標準UIであるFluent UI で実装されています。

サービスの使用

.NET Aspireでは様々なサービスが標準化されたパターンで使用可能になっています。これは、Azureで提供されているリソースのみならずOSSライブラリであったりMicrosoft以外が提供するサービスも含まれています。たとえば、Keycloak。たとえば、Elasticsearchです。

Semantic Kernel

今が旬のAIエージェントを作成するためのミドルウェアの一つがSemantic Kernelです。
これのもっとも実装が進んでいる言語の一つがC#といえます。
AIといえばPythonのイメージが非常に強いですがSemantic Kernelの登場によりAIエージェントを作成する言語としてC#が一つの候補として上がります。

Semantic Kernelの優位点としてすでにあるアプリケーションにAIエージェントを組み込むというシチュエーションにおいてC#やJavaというエンタープライズレディーな言語を選択できるというところが非常に大きいです。
これまで説明してきたとおり、可観測性、レジリエンス、スケール・・・などエンタープライズアプリケーションに求められる要素を兼ね備えている点がアドバンテージになります。

まとめ

C#はLINQ、ジェネリック、async/awaitなどの現代的な言語に求められる要素をいち早く取り入れてきました。Visual Studioという強力な統合開発環境で高い生産性があります。
.NETでは業界標準の実装を多く取り入れています。また、クラウドネイティブアプリケーションに対応したライブラリも充実しておりクラウドネイティブアプリケーションを作成する上でも最適な言語の一つとなっています。
WindowsだけではなくLinux、MacOS、Android、iOSといったプラットフォームで動作し、コンソールアプリを始め、デスクトップアプリ、Webアプリ、IoT、MR、モバイルなど様々なアプリケーションを作ることができます。
また、パフォーマンスにも優れ同じサイジングで多くのリクエストを捌くことができます。これによりコンピューティグ電力の需要を抑え地球環境を守ることができます。
.NETはオープンソースです。常に多くの開発者に監視されソースの安全性を保っています。

Discussion