多様性と自由の尊重

スタートアップでエンジニアしてます。多様な社会に支えられていることに感謝しながら、自由に生きています。

【備忘】C#

▼Taskについて

Taskとは、

スレッドプールとは、

Task.Runとは、ThreadPool上で指定した作業をキューに配置し、その作業のタスク、あるいはT<Result>を返す。

https://docs.microsoft.com/ja-jp/dotnet/api/system.threading.tasks?view=netcore-3.1
https://qiita.com/4_mio_11/items/f9b19c04509328b1e5c1
https://tech-lab.sios.jp/archives/15637
## メリット
・非同期で実施した処理の状態(実行中、完了、キャンセル、エラー)を知ることができる
・例外を補足することができる
・非同期処理の実行順序を制御できる
・Task.Runは、重たい処理などを別スレッドで行いたいときに使用


## スレッドプールについて
https://docs.oracle.com/cd/E19253-01/819-0390/ggedn/index.html

 

▼オーバーライド

```
class Class2 : Class1
Class2はClass1の子クラス。
```

 

▼Deligate

簡単に言えば、関数を変数のように扱うためのもの。
以下がわかりやすい。
https://ufcpp.net/study/csharp/sp_delegate.html
https://tech-lab.sios.jp/archives/15318


## マルチキャストデリゲート
+=をつけることで、複数のメソッドを代入することが可能。

```
class DelegateTest
{
static void Main()
{
ShowMessage a = new ShowMessage(A);
a += new ShowMessage(B);
a += new ShowMessage(C);
a();
}
static void A(){Console.Write("A が呼ばれました。\n");}
static void B(){Console.Write("B が呼ばれました。\n");}
static void C(){Console.Write("C が呼ばれました。\n");}
```
```
result
A が呼ばれました。
B が呼ばれました。
C が呼ばれました。
```

##「=>」 ラムダ式
https://qiita.com/rawr/items/11790e9ea08a29d028a4

## 非同期呼び出し
デリゲート呼び出しは非同期に行うことも出来ます。 通常、メソッドを呼び出すとメソッド内の処理が完了するまで呼び出し元には戻ってきません。 このような動作を同期呼び出し (Synchronous Call) と呼びます。 それに対して、非同期呼び出し (Asynchronous Call) とは、 メソッドを呼び出した瞬間に呼び出し元に処理が戻ってくるような呼び出しのことです。 デリゲートの非同期呼び出しをすると、 デリゲートを介して呼び出されるメソッドの処理と、呼び出し元の処理が平行して行われることになります。 (このような平行した動作については「マルチスレッド」で詳しく説明します。)

デリゲート型を定義すると、 C# コンパイラによって自動的に BeginInvoke と EndInvoke というメソッドが生成されます。 この BeginInvoke を用いることにより非同期呼び出しを開始し、 EndInvoke を用いることにより非同期処理の終了を待つ事が出来ます。

BeginInvoke は、デリゲート型の定義時に引数リストで指定した引数と、System.AsyncCallback デリゲート型の引数および object 型の引数をとり、System.IAsyncResult インターフェース型の値を返します。 また、 EndInvoke はデリゲート型の定義時に ref または out キーワードを付けた引数および System.IAsyncResult インターフェース型の引数を持ち、デリゲートの戻り値と同じ型の戻り値を持ちます。 例えば、delegate int ShowMessage(int n, ref int p, out int q); というデリゲート型を定義した場合、以下のようなメソッド定義になります。

## NULL条件演算子
変数(オブジェクト)の最後に付与される"?"の意味は、NULLチェックを行っている。
例外(System.NullReferenceException)は発生せず、全体がnullとして処理が進む。


## Invoke
デリゲートを実行する。
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.control.invoke?view=netcore-3.1

## スレッド
https://qiita.com/rawr/items/5d49960a4e4d3823722f
https://tech-lab.sios.jp/archives/15637