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

C#のローカル関数とは?使い方やメリット・ラムダ式との違いも紹介

2020年07月27日

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

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

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


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

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

C#のローカル関数のメリット


C#ローカル関数のメリットとしては、以下の内容があげられます。

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

C#のローカル関数の基本的な構文


C#のローカル変数の基本的な書き方は以下になります。

ローカル関数を呼び出すことができる要素

C#のローカル関数は関数だけでなく以下のようなブロックを持つメンバにも記述可能です。

・コンストラクタ
・プロパティ アクセサ
・イベント アクセサ
・ラムダ式
・ファイナライザ
・その他のローカル関数

ローカル関数と通常の関数との違い

C#のローカル関数の書き方は、通常の関数とほとんど同じですが次のような違いがあります。

・staticキーワードは付与できない
・アクセス修飾子を付与できない
・属性を付与できない

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

C#のローカル関数の使い方


ここからはC#のローカル関数の例外発生タイミングとデリゲートでC#のローカル関数を使った時の動きについて紹介します。紹介したプログラムを実際に動かしてみるとより理解が深まります。

例外を検出する

メソッド反復子、非同期メソッドで例外が発生するタイミングは実際に例外になる処理が実行されるときになります。しかしC#のローカル関数を使った場合、それぞれ反復子の取得時、非同期メソッド実行前に発生するようになります。

メソッド反復子を使う

メソッド反復子の場合、例外は、反復子を取得した時点では検出されず、シーケンスを列挙する時点で検出されます。

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

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

実行結果は以下のようになります。
ArgumentOutOfRangeExceptionが先に発生しています。
反復子を取得した時点で例外が検出されることが分かります。

非同期メソッドを使う

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

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

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

このように、例外はAggregateExceptionにラップされ、タスク待機中に検出されます。
これに対して、C#のローカル関数にすると非同期メソッドを呼び出す前に例外を検出できます。
実行結果は以下のようになります。
このように、C#のローカル関数にすると非同期メソッドを呼び出す前に例外を検出できます。
また、例外はAggregateExceptionにラップされることもありません。

デリゲートとして扱う

C#のローカル関数は、通常メソッドと同じようにデリゲートとしても使用できます。

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

C#のローカル関数とラムダ式の違い


C#のローカル関数はラムダ式と似ていますが、以下のようにラムダ式とは異なる特徴があります。

・関数名が必要
・引数の型を指定できる
・引数に既定値を与えられる
・イテレータ(yield return ステートメント)が使える

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

ローカル関数を使用したサンプルコード

C#のローカル関数では引数の型を宣言することができます。

ラムダ式を使用したサンプルコード

一方、ラムダ式は引数の型を指定できないため、使用時の型に依存した動きになります。

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

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

C#のローカル関数について知ろう


いかがでしたでしょうか。C#のローカル変数には可読性の向上のほか、ラムダ式では実現できなかったイテレータの使用など様々な使い方ができます。

実際にコードを実行して理解を深め、使用すべきところを検討してください。


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

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

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

Search

Popular

reccomended

Categories

Tags