C#学習記録4/7~

## string, out string, ref string, in stringの違い
### 1. 通常の string
```C#
public void DoSomething(string text)
```
**値の受け渡し方法**
変数が参照しているオブジェクトのアドレス(参照)がコピーされる
**特徴**
メソッド内で引数に新しい値を代入しても、呼び出し側の変数には反映されません。

### 2. ref string
```C#
public void DoSomething(ref string text)
```
**受け渡し方法**
変数自体を参照渡しします。呼び出し側の変数の実体そのものを渡すため、メソッド内で変数に対して行った変更が呼び出し側にも反映されます。
**使用条件:**
呼び出す前に、対象の変数は必ず初期化されている必要があります。

### 3. out string 
```C#
public void DoSomething(out string text)
```
**受け渡し方法**
こちらも参照渡しですが、出力専用のパラメータです。メソッドから複数の値を返すときなどに使用します。
**使用条件**
呼び出す前に変数を初期化する必要はありません。
メソッド内では必ず値を代入してから終了しなければなりません（コンパイルエラーになります）。

### 4. in string
```C#
public void DoSomething(in string text)
```
**受け渡し方法**
C# 7.2 以降で使用可能な「読み取り専用の参照渡し」です。
**特徴:**
メソッド内で値を変更（再代入）することはできません。
参照渡しのため、大きな構造体などのコピーコストを避ける目的で用いられます。
文字列の場合は参照型であり、また不変なので、通常はコピーコストが低いですが、同じ意味で利用可能です。

### 5. ref readonly string
```C#
public void DoSomething(ref readonly string text)
```
**特徴**
**参照渡し:** 引数はコピーされず、元のデータへの参照がメソッドに渡されます
**読み取り専用:** メソッド内では渡された引数の値を変更できません


## まとめ
通常の string:
渡された参照自体のコピーが行われ、メソッド内でその変数に新たな値を代入しても呼び出し側には反映されない。

ref string:
呼び出し側の変数の実体を渡すため、メソッド内で値を変更すると呼び出し側にも反映される。呼び出し前に必ず初期化が必要。

out string:
出力専用パラメータ。呼び出し前の初期化は不要だが、メソッド内で必ず初期化（値の代入）する必要があり、複数の戻り値を返す場合に利用する。

in string:
読み取り専用の参照渡し。パフォーマンス向上のために使われ、メソッド内での変更が禁止される。変更不要な引数の受け渡しに適している。

## 画像を出力するための方法であるwindow.ShowImageとCv2.ImShowの違い
### Cv2.ImShow
**静的メソッド**
OpenCvSharpの Cv2 クラスにある静的メソッドで、画像を表示するためのシンプルな呼び出し方です。
**自動ウィンドウ管理**
指定したウィンドウ名に基づいてウィンドウを自動生成します。ウィンドウの作成や更新、破棄を内部で処理するため、手軽に画像を表示できます。
**使い方**
```C#
Cv2.ImShow("WindowName", image);
```
**利用シーン**
簡単なデバッグや、画像表示のためだけにウィンドウ管理を細かく制御する必要がない場合に便利です。

### window.ShowImage
**インスタンスメソッド:**
OpenCvSharpの Window クラスのインスタンスメソッドです。Windowオブジェクトは、ウィンドウをオブジェクトとして管理します。

**手動ウィンドウ管理:**
ウィンドウを生成した Window インスタンスに対して、ShowImage メソッドで画像の更新を行います。これにより、ウィンドウの位置やサイズ、ライフサイクルの制御をより柔軟に行えます。
```C#
using (var window = new Window("WindowName"))
{
    window.ShowImage(image);
    // ループ内で定期的に画像を更新することも可能
}
```
**利用シーン:**
ウィンドウに対して細かい制御（例えば、複数のウィンドウを扱う、ウィンドウ位置の調整、後片付けの管理など）が必要な場合に適しています。

## xmlファイルとは
XMLファイルは「eXtensible Markup Language（拡張可能マークアップ言語）」の略で、データの構造を記述するために用いられるテキストベースのファイル形式です。

## パースとは
文字データを解析して一定の形式のデータ構造に変換する処理

## ToArray()とは
IEnumerable<T>型のシーケンス（ここではキーコレクション）を配列（T[]型）に変換するLINQ（Language Integratd Query）に含まれる拡張メソッド

## IEnumerable<T>とは
* インターフェースで、すべての要素を順次列挙することを保証

## T[]とは
* 固定長の具体的な配列型
* 即時評価されランダムアクセスが容易

## usingブロック内での決まりごと
usingブロック内ではIDisposableを実装しているオブジェクトを生成・初期化する必要があります

## プロパティ（setter/getter）の書き方使い方
C#のクラスは**フィールド（データを格納する場所。メンバ関数とも呼ばれる）**と**メソッド**から構成されており、カプセル化などで外部からアクセスを防いでいるときにメンバ関数にアクセスする際にsetterとgetterを使う。

## Marshal.Copy（）の使い方
Marshal は、.NET の マネージドコード と ネイティブ（アンマネージド）コード の間でデータをやり取りするためのユーティリティをまとめたクラスです。正確には、System.Runtime.InteropServices.Marshal クラスです。

## Matとは？
OpenCVのcv::Matはヘッダー部とデータ部分に分かれている
内部のデータ構造は以下のようになっている
```cpp
class Mat
{
public:
    // --- ヘッダー情報 ---
    int flags;        // 型情報とメモリ管理フラグ (データ型、チャンネル数、連続性など)
    int dims;         // 次元数（通常 2）
    int rows, cols;   // 行数、列数
    uchar* data;      // 画素データへのポインタ
    const uchar* datastart;  // 実際に確保された領域の先頭 (data とずれることあり)
    const uchar* dataend;    // 実際に確保された領域の末尾
    size_t* step.p;   // 各軸方向のバイトオフセット（step[0] = 行の先頭から次の行の先頭までのバイト数）
    
    // 参照カウント＋アロケータ情報
    UMatData* u;      // 自前 or UMat（GPU）用データ構造
    MatAllocator* allocator;  // メモリ確保／解放を担当
};
```

### 参考文献
[C# プロパティ（setter/getter）の書き方使い方](https://qiita.com/No2DGameNoLife/items/2c42337d41db5d6b176d)