.net column

.NET開発者のためのブログメディア

C#のローカル関数とは?使い方やメリットをご紹介!

2020年07月27日

SE
C#のローカル関数とは何ですか?

PM
ローカル関数とは、関数の中に記述する関数のことで、C# 7.0から追加された機能です。

C#のローカル関数とは?

今回は、C#のローカル関数について説明します。ローカル関数とは、関数の中に記述する関数のことで、C# 7.0から追加された機能です。

ローカル関数の使い方やメリットについて説明します。C#のローカル関数に興味のある方はぜひご覧ください。

ローカル関数とは

C# 7.0までは、通常の関数は以下のように記述していました。

ローカル関数を使うと、以下のように記述できます。

当然ながら、どちらも同じ結果になります。
また、通常の関数定義と同様に再帰やイテレータが記述できます。

ローカル関数のメリット

C#のローカル関数のメリットとしては、以下の内容があげられます。
・内部的にしか使用しない変数の値を隠蔽可能
・変数のスコープが関数内に限定されるので、プログラマが読みやすい
・親関数で引数チェックされていれば、改めての引数チェックは不要(コードがシンプルになる)
・親関数の変数を使用できるので、ローカル関数の引数が少なくなる(コードがシンプルになる)
・メソッド反復子や非同期メソッドで例外を直ちに検出できる(後述します)

ローカル関数の書き方

C#のローカル関数の書き方は、通常の関数とほとんど同じです。
次のような違いがあります。
・staticキーワードは付与できない
・アクセス修飾子を付与できない
・属性を付与できない

また、C#のローカル関数は、ローカル変数とは違い、定義前でも参照できます。

ローカル関数と例外(メソッド反復子)

C#のローカル関数は、例外を直ちに検出できるメリットがあります。メソッド反復子の場合、例外は、反復子を取得した時点では検出されず、シーケンスを列挙する時点で検出されます。

実際のソースコードを見てみましょう。

実行結果は以下のようになります。

例外は、反復子を取得した時点では検出されず、シーケンスを列挙する時点で検出されることが分かります。

これに対して、ローカル関数にすると、反復子を取得した時点で例外を検出できます。

実行結果は以下のようになります。

ArgumentOutOfRangeExceptionが先に発生しています。
反復子を取得した時点で例外が検出されることが分かります。

ローカル関数と例外(非同期メソッド)

非同期メソッドの場合、例外はAggregateExceptionにラップされ、タスク待機中に検出されます。

実際のソースコードを見てみましょう。

実行結果は以下のようになります。

このように、例外はAggregateExceptionにラップされ、タスク待機中に検出されます。

これに対して、ローカル関数にすると非同期メソッドを呼び出す前に例外を検出できます。

実行結果は以下のようになります。

このように、ローカル関数にすると非同期メソッドを呼び出す前に例外を検出できます。
また、例外はAggregateExceptionにラップされることもありません。

SE
C#のローカル関数を用いることで、可読性が上がるなどのメリットがあるのですね。

PM
そうですね。ローカル関数について理解を深め、関数を作成すべきかを検討してみてくださいね。

C#のソースコードを書いてみよう

C#のローカル関数についてご紹介しましたが、いかがでしたでしょうか。C# 7.0から追加されたローカル関数には様々なメリットがあります。

通常の関数との違いを理解し、ローカル関数で作成するべきか否か検討してみてください。ぜひご自身でC#のソースコードを書いて、理解を深めてください。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

求人一覧

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)