📑

.NETがわからんので個人的メモな感じでまとめてみた(概要的なところ)

5 min read

前置き

この記事では.NETを全く触ったことがない筆者が書籍や公式ドキュメントを通じて学習したことのまとめです。
なのである程度のフィルターがかかっており、個人的に必要である項目については記述しますが、それ以外については割愛している部分があります。
この記事だけでなく、公式ドキュメントを参照すると知識が深まると思います

Microsoft公式ドキュメント

.NETとは・・

.NETとはWindowsOSのアプリケーションやWebアプリなどを作成することを目的としたフレームワークで
無料で公開されているオープンソースな開発ツールである。
また.NETを使用するとビルドするアプリに関係なく、コードやプロジェクトファイルの外観が同じになり、各アプリで同じランタイム[1]、APIや言語の機能にアクセスしたりすることもできる。

クロスプラットフォーム

上のイメージにあるようにOSについては以下のものが.NETで作成できる

  • Windows
  • macOS
  • Linux
  • Android
  • iOS
  • tvOS
  • watchOS

なおサポートされているプロセッサアーキテクチャは以下の通り

  • x64
  • x86
  • ARM32
  • ARM64

.NETの場合、OS APIなどのプラットフォーム固有の機能を使用することができ、
WindowsであればWindowsフォームとWPF、Xamarinからはモバイルプラットフォームからのネイティブバインドなどがある

使用できるプログラミング言語

.NETはつぎのプログラミング言語がサポートされている

  • C#
    タイプセーフなオブジェクト指向プログラミング言語
  • F#
    関数型および命令形のオブジェクト指向プログラミングモデルをサポート
  • Visual Basic
    C#やF#と比べ比較的安定した言語ではあるがWebアプリにはサポートされていない(webAPIは対応)

また.NETでサポートされる機能については次の通り

  • タイプセーフ
  • 型の推定
  • ジェネリック型
  • デリゲート
  • ラムダ
  • イベント
  • 例外
  • 属性
  • 非同期コード
  • 並列プログラミング
  • コードアナライザー

SDKとランタイム

.NET SDKは.NETアプリケーションを開発・実行するためのライブラリとツールのセットで、
ASP.NET Coreや.NETランタイムなどのランタイムあるいはSDKを選択することができる。

SDKのDLにはつぎのコンポーネントが含まれる

  • .NET CLI
    ローカル開発およびCIスクリプトに使用できるコマンドラインツール
  • dotnetドライバー
    フレームワーク依存アプリを実行するCLIコマンド
  • RoslynおよびF#のコンパイラ
  • MS Build
  • .NETランタイム
    型システム、アセンブリ読み込み、ガベージコレクターやネイティブ相互運用機能などの基本的なサービスの提供
  • ランタイムライブラリ
    プリミティブデータ型および基本的なユーティリティの提供
  • ASP.NET Coreランタイム
    WebアプリやIoTアプリ、モバイルバックエンドなどのネットワークに接続されたアプリ用のサービスの提供
  • デスクトップランタイム
    WindowsフォームやWPFなどWindowsデスクトップ用アプリの基本的なサービスの提供

ランタイムにはつぎのコンポーネントが含まれる

  • デスクトップまたはASP.NET Coreランタイム(これらは省略可能)
  • .NETランタイム
    型システムやアセンブリ読み込み、ガベージコレクターやネイティブ相互運用機能など
  • ランタイムライブラリ
    プリミティブデータ型および基本的なユーティリティの提供
  • dotnetドライバー
    フレームワーク依存アプリを実行するCLIコマンド

JITコンパイラとIL

C#などの高レベル.NET言語は中間言語(IL)に依存しない命令セットにコンパイルされる。
アプリを実行すると、JITコンパイラによってプロセッサで認識されるマシンコードにILが変換され、JITコンパイルはコードが実行されるのと同じマシン上で行われる。

JITコンパイルはアプリケーションの実行中に行われるため、コンパイル時間は実行時間の一部となる。
このためJITコンパイラを使用してコードの最適化に要する時間と、結果のコードによって得られる時間の節約とのバランスを取る必要がある。
ただし、JITコンパイラによって実際のハードウェアが認識されるため開発者は異なるプラットフォームに対してそれに対応した実装を提供する必要はなくなる。

.NET JITコンパイラを使用すると"階層型コンパイル"を実行できる。
この機能を使用すると、瞬時にコンパイルできると同時に頻繁に使用されるメソッドに対して高度に調整されたバージョンのコードを生成することができる。

自動メモリ管理

"ガベージコレクター(GC)"によってアプリケーションのメモリの割り当てと解放が管理される。
コードで新しいオブジェクトが生成されるたびに、CLRによってマネージドヒープからオブジェクトにメモリが割り当てられる。
マネージドヒープに使用可能なアドレス空間がある限り、ランタイムは新しいオブジェクト用に領域の割り当てを続け、十分な空きアドレス空間が残っていない場合、ガベージコレクションによってアプリケーションで使用されなくなったマネージドヒープ内のオブジェクトが確認される。
その後、そのメモリは再利用される。

"メモリの安全性"の確保に役立つCLRサービスの一つとしてガベージコレクターはある。
割り当てられているメモリのみにプリグラムがアクセスする場合、そのプログラムはメモリセーフである。
ランタイムでは配列の範囲を超えた割り当てられないメモリにアプリがアクセスしていないことを確認する。

アンマネージ リソースの操作

実際に記述するコードでは"アンマネージ リソース"を参照する場合がある。
アンマネージ リソースとは、.NETランタイムで自動的に維持できないリソースのことを指している。
例えばファイルハンドルはアンマネージリソースであるが、FileStreamオブジェクトはマネージオブジェクトでありながらアンマネージドのファイルハンドルを参照する。
FileStreamでの参照が終了すると、ファイルハンドルを明示的に解放する必要がある。

.NETでは、アンマネージリソースを参照するオブジェクトはIDisposableインターフェイスを実装し、オブジェクトの使用が終わると全てのアンマネージリソースを解放するオブジェクトのDispose()メソッドを呼び出す。
これらは、.NETによってusingステートメントが提供され、これによりDisposeメソッドが確実に呼び出されることになる。

デプロイモデル

.NETアプリは以下のモードで公開できる

  • "自己完結型"
    .NETランタイムとライブラリ、及びアプリケーションとその依存関係を含む実行可能ファイルが生成される。
    ユーザは.NETランタイムがインストールされていないマシン上で実行することができる。
    自己完結型アプリはプラットフォーム固有であり、必要に応じてAOTコンパイル形式を使用して公開できる

  • "フレームワーク依存"
    アプリケーション自体とその依存関係のみを含む実行可能ファイルとバイナリファイル(.dll)が生成される。
    ユーザは.NETランタイムを個別にインストールする必要がある。
    実行可能ファイルはプラットフォーム固有だが、フレームワークに依存するアプリケーションの.dllファイルはクロスプラットフォームである。

実行可能ファイルはランタイム識別子(RID)で指定する特定のターゲットプラットフォームに対して生成される。

データアクセス

.NETによってオブジェクトリレーショナルマッパー(ORM)とコードでSQLクエリを記述する方法がある。

LINQ

統合言語クエリ(LINQ)を使用すると、データを操作するための宣言コードが記述できる。
データはさまざまな形式にすることができるが、記述するLINQコードは通常どのデータソースでも違いがないように見える

Entity Framework Core

Entity Framework(EF) Coreはオープンソースのクロスプラットフォームデータアクセステクノロジーであり、ORMとして使用できる。
EF Coreを使用するとコードで.NETオブジェクトを参照してデータベースを操作することができ、
これにより、書き込みとテストに必要なデータアクセスコードの量が減る。
EF Coreでは多くのデータベースエンジンがサポートされている。

脚注
  1. 共通言語ランタイム(CLR:Common Language Runtime)と動的言語ランタイム(DLR:Dynamic Language Rantime)がある ↩︎

Discussion

ログインするとコメントできます