たくあんポリポリ

勉強したことを載せていきます。最近、技術系の記事はZennに書いています。(https://zenn.dev/chittai)

【C#】delegateにおけるFunc / Action 型とはなにか

delegateを勉強していると、色々な情報が出てきてよくわからなくなると思います。delegateを使った定義にについて勉強したいのにFuncだのActionだの出てきて何を勉強すればいいのかわからない!となることもあると思います。なので、まずはFunc / Actionについて簡単に説明します。

前回の記事

c-taquna.hatenablog.com
一応。

Func / Action is 何

docs.microsoft.com
FuncだけURLを載せていますが、両方共”デリゲート”です。前の記事でも書きましたが、デリゲートは処理を参照する型です。delegate を使用した定義では、”何型を返し、何型の引数をとる”のか記述する必要がありました。このFunc/Actionでも使用する際には同じ様に”何型を返し、何型の引数をとる”のか記述して上げる必要があります。ただ、delegateを使用した記述とは異なります。

Func / Action の明確な違い

まず何型を返すかですが、そもそも何か返すのか、もしくは返さないのかを決める必要があります。それがFunc/Actionの違いです。

- Func 指定した型を返す
- Action 何も返さない

つまり、何かしらをリターンしてほしいときはFuncを使うし、何もリターンしないなら Actionを使います。

Func/Actionってどう使えばいいの?

繰り返しになりますがデリゲートでは”何型を返し、何型の引数をとる”のか記述する必要があります。これをどう記述するのか書いていきます。

Func

f:id:c_taquna:20190126000854j:plain:w200
これはMSDNから撮ってきたキャプチャです。 Func<>の<>には下記3要素が記述されてます。

- T
- T1 - T 16
- TResult

"T " "T1-T16"これは引数です。最大16個まで型の指定ができます。"TResult"は返り値の型です。1つだけ指定します。つまり、

- Func<TResult>は引数無しで、TResult型を返す
- Func <T,TResult>はT型の引数を1つとり、TResult型を返す
- Func <T1 - T16,TResult>はT型の引数を16個とり、TResult型を返す(T1-T16はそれぞれ別の型で問題ありません)

となります。

Func<int , int> delegateMethod

この様に定義した場合、delegateMethodには”intの引数を1つとり、intの値を返す”処理を登録することができます。

Action

f:id:c_taquna:20190126001905j:plain:w200
またMSDNからとってきました。Actionは返り値がないのでTResultがないですね。

Action<int , int> delegateMethod

この様に定義したら、Funcとは異なり int 型の引数を2つとるという型になります。

delegateで型を定義することとの違いは?

これは、わざわざデリゲートを定義しなくても良くなり、使用しやすくなった点や、汎用性が高まった点が挙げられると思うのですが、ほかに明確な理由があれば知りたいです。