C#学習記録 ~4/4(金)

## InitializeComponent()とは
Visual Studio のデザイナーが自動生成するメソッドで、ユーザーインターフェース（UI）コンポーネントの初期化と設定を行うためのもの

## partialキーワードとは
partial キーワードは、C# においてクラス、構造体、またはインターフェースの定義を複数のファイルに分割して記述することを可能にするためのもの

## publicとは
C# におけるアクセス修飾子の一つです。クラス、メソッド、プロパティ、フィールド、コンストラクターなどに付けることができ、どこからでもアクセス可能であることを示す

```C#
private void btnClick_Click(object sender, EventArgs e)
```
:::note
void = 戻り値が何もないことを示している
object sender = イベントを発生させたオブジェクト
EventArgs e = イベントに関する追加情報
:::

```C#
string imagePath = Path.Combine(Application.StartupPath, "image", "neko.jpg");
```
:::note
Application.StartupPath = アプリケーションの実行ファイルがあるディレクトリを取得
:::

```C#
using (Mat mat = new Mat(imagePath))
{
    Cv2.ImShow("sample_show", mat);
}
```
usingを理解するにはまずruntimeを理解しなければならない
### runtimeとは
runtimeには2つの意味がある
1. 時間的な意味での「ランタイム」
2. 実行に必要な部品を指す「ランタイム環境」
:::note
.NET CLR (Common Language Runtime): .NETアプリケーションの実行環境で、メモリ管理、型安全性、例外処理などを提供します。
:::

## usingブロックは、
主に IDisposable インターフェース を実装しているオブジェクトのリソースを自動的に解放するために使われる

## メモリリークとは
メモリリークとは、プログラムが一度確保したメモリ領域を、不要になったにも関わらず適切に解放（リリース）しないために、使われなくなったメモリがプログラム内に残り続ける現象

マネージドコードはガベージコレクションによってnitializeComponent()とは
Visual Studio のデザイナーが自動生成するメソッドで、ユーザーインターフェース（UI）コンポーネントの初期化と設定を行うためのもの

## partialキーワードとは
partial キーワードは、C# においてクラス、構造体、またはインターフェースの定義を複数のファイルに分割して記述することを可能にするためのもの

## staticキーワードとは
クラスやそのメンバー(フィールド、プロパティ、メソッド、コンストラクターなど)をインスタンスではなく、クラス自体に所属させるために使用される

## Matとは
MatクラスはOpenCvSharpにおける画像処理の中心的な役割を果たすクラスで、画像データの読み込み、変換、表示、保存などあらゆる画像処理の基本機能を提供する。
Matは複数のコンストラクターが用意されている
```C#
Mat mat = new Mat("path/to/image.jpg");
```
**引数:**
ファイルパス（string）：読み込みたい画像ファイルのパス。
このコンストラクターは、指定したパスから画像を読み込むために利用されます。

## publicとは
C# におけるアクセス修飾子の一つです。クラス、メソッド、プロパティ、フィールド、コンストラクターなどに付けることができ、どこからでもアクセス可能であることを示す

```C#
private void btnClick_Click(object sender, EventArgs e)
```
:::note
void = 戻り値が何もないことを示している
object sender = イベントを発生させたオブジェクト
EventArgs e = イベントに関する追加情報
:::

```C#
string imagePath = Path.Combine(Application.StartupPath, "image", "neko.jpg");
```
:::note
Application.StartupPath = アプリケーションの実行ファイルがあるディレクトリを取得
:::

```C#
using (Mat mat = new Mat(imagePath))
{
    Cv2.ImShow("sample_show", mat);
}
```
usingを理解するにはまずruntimeを理解しなければならない
### runtimeとは
runtimeには2つの意味がある
1. 時間的な意味での「ランタイム」
2. 実行に必要な部品を指す「ランタイム環境」
:::note
.NET CLR (Common Language Runtime): .NETアプリケーションの実行環境で、メモリ管理、型安全性、例外処理などを提供します。
:::

## usingブロックは、
主に IDisposable インターフェース を実装しているオブジェクトのリソースを自動的に解放するために使われる

## メモリリークとは
メモリリークとは、プログラムが一度確保したメモリ領域を、不要になったにも関わらず適切に解放（リリース）しないために、使われなくなったメモリがプログラム内に残り続ける現象

**マネージドコード**はガベージコレクションによって不要になったメモリを自動で回収してくれるためメモリリークのリスクが抑えられる

**アンマネージドコード**はアンマネージドコードは、CLRの管理外で直接OS上で実行されるコードです。たとえば、CやC++で書かれたコードがこれに該当します。ガベージコレクションが存在しないので手動でメモリの確保と開放を手動で行う必要がある。
そこで用いられるのが
```C#
using 
resource.Dispose();
```

## IDisposableとDisposableの違いは
IDisposable インターフェイス
**定義:**
.NET において、アンマネージドリソース（ファイルハンドル、データベース接続、ネイティブメモリなど）の解放を明示的に行うために定義されたインターフェイスです。

**契約内容:**
Dispose() というメソッドを実装することが求められており、これによりオブジェクトが使用するリソースを適切に解放できます。

**利用目的:**
ガーベジコレクションでは管理されないリソースのクリーンアップを明示的に行うため、開発者がリソース管理のタイミングを制御できるようにします。

## namespaceとは
C# における名前空間の概念を表す

## stringとout stringの違い
**string** パラメーターの場合、呼び出し側で値を設定して渡します（値が設定されていなくてもコンパイルエラーにはならない場合もありますが、意図しない動作になる可能性があります）。

**out string** パラメーターは、呼び出し側で初期化しなくてもよく、メソッド内で必ず値を設定する必要があります。

## デザイナーを表示するには
右クリックでデザイナーを表示

## .NETとは
・Mincrosoft社が開発したWindowsアプリケーションを開発するためのクロスプラットフォーム
・C#など複数のプログラミング言語に対応しており、WindowsだけでなくMacやLinuxでも動作します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4042319/f15f7582-4c12-4186-8029-358ef45c4907.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4042319/c0216c16-f396-4c82-9849-7ca1dfcfad02.png)

## ASP.NETとは
Webアプリを作るために主に使われる

# Blazorの特徴
**Blazor**は3つの動作モードがあり、目的に応じて柔軟に使い分けることができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4042319/0a100a1d-e039-48a6-99ae-f812a033a520.png)

# ライブラリ
※ .NETクラスライブラリのSystem.Randomクラスを使用
```C#
Random dice = new Random();
int roll = dice.Next(1, 7);
```
このコードにおいて```dice```はオブジェクト、```Next```はメソッド、```Random```はクラス。
1行目ではインスタンス生成を行っていて、```dice```という変数にオブジェクトの参照を格納している。
```C#
Console.WriteLine(roll);
```
```Console```はクラス、```WriteLine()```はメソッド。
### ステートレスメソッド
すでにメモリに入っている値を参照しない
```C#
Console.WriteLine("Hello World!");
```
### ステートフルメソッド
メモリ内に入った値を参照して、更新する
```C#
Random dice = new Random();
int roll = dice.Next(1, 7);
```
ここで```new```はメモリを確保して、インスタンスを生成する役割を担っている。
### オーバーロード
##### 1. 引数に様々なデータ型が使える
```C#
Console.WriteLine(10)
Console.WriteLine("Hello World!")
```
##### 2. 引数の数が選べる
```C#
int rand1 = dice.Next()
int rand2 = dice.Next(100)
int rand3 = dice.Next(90, 100)
```
それぞれの```rand```のことを**戻り値**という。
## Core Identityによる認証基盤
・Core Identityとは組み込みの認証基盤である。
・Core Identityを使うとユーザー登録、ログイン、ロールベースのアクセス制御等を行えます。
・app.dbファイルがSQliteにおいてはデータベースの実体。

## Entity Framework Core(EF Core)によるDB管理の抽象化
EF Coreは**Object-Relational Mapping**(ORM)フレームワークです。
:::note
ORMは、プログラミングのオブジェクトとDBのテーブルを自動的にマッピングする技術です。これにより、開発者は複雑なSQLクエリを直接角割に、オブジェクト指向のコードを使用してDBテーブルへアクセスできます。
:::
EF Coreを理解するうえで重要なポイントを3つ紹介します。
#### ①コードファーストアプローチ
EF Coreでは、DBのテーブルや関係を直接設計する代わりに、C#のクラスを使用してモデルを定義します。
このC#コードからDBのスキーマを自動生成できるため、コードとDBの整合性が保たれます。
C#のコード(クラス定義)を最初に書くため、「コードファースト」言うわけである。

#### ②LINQによるデータ操作
EF Coreは、LINQ(Language Integrated Query)を使用してDBアクセスを簡単に記述できます。
これにより、SQLを直接書くよりも直感的かつ安全な方法でデータを取得、更新、削除できます。
#### ③様々なDB管理システムへの対応
EF Coreは多くの異なるDBプロバイダ(SQL Server, PostgreSQL, SQLiteなど)に対応しています。
# DIコンテナ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4042319/b5125152-efd0-41f1-ac7e-bafc2d5a2201.png)
DIコンテナは、プログラムを構成する部品（クラスやオブジェクト）の関係性を自動的に管理してくれる仕組みです。