[解決済み】ローカル関数とラムダ C# 7.0
質問
の新しい実装を見ています。 C# 7.0 で、ローカル関数を実装しているのは面白いけど、ラムダ式よりローカル関数を優先するシナリオが想像できないし、両者の違いは何なのか。
確かにラムダは
anonymous
しかし、ローカル関数がラムダ式より優れているという現実的なシナリオが思いつかないのです。
何か例があれば教えてください。ありがとうございます。
どのように解決するのですか?
これは、ローカル関数が最初に議論された C# Design Meeting Notes で Mads Torgersen が説明したものである。 :
ヘルパー関数が欲しいのですね。この関数は一つの関数の中だけで使用され、その関数のスコープ内にある変数や型パラメータを使用する可能性があります。一方、ラムダと違って、第一級のオブジェクトとして使う必要はないので、デリゲート型を与えて実際のデリゲート・オブジェクトを割り当てる必要はない。また、再帰的、汎用的、あるいはイテレータとして実装したい場合もあります。
もう少し拡大解釈すると、メリットは
-
性能を発揮します。
ラムダを作成する際、デリゲートを作成する必要がありますが、この場合、不要なアロケーションとなります。ローカル関数は本当にただの関数で、デリゲートは必要ありません。
ラムダは通常、変数をクラスに取り込みますが、ローカル関数は、構造体(この例では、"S "を使用して渡されます)を使用して、ローカル変数をより効率的に取り込むことができます。
ref
を使用することで、アロケーションを回避することができます。また、ローカル関数の呼び出しも安価になり、インライン化も可能で、さらにパフォーマンスが向上する可能性があります。
-
ローカル関数は再帰的であることが可能です。
ラムダも再帰的であることが可能ですが、その場合、最初に
null
をデリゲート変数に、次にラムダを指定します。ローカル関数は当然ながら再帰的である(相互に再帰的であることを含む)。 -
ローカル関数はジェネリックにすることができます。
ラムダは具象型を持つ変数に代入しなければならないので、ジェネリックにはできません(その型は外部スコープからジェネリック変数を使用できますが、同じことではありません)。
-
ローカル関数は、イテレータとして実装することができます。
ラムダは
yield return
(そしてyield break
を実装するためのキーワードです。IEnumerable<T>
-を返す関数です。ローカル関数は可能です。 -
ローカル機能の方が見栄えがする。
これは上記の引用文には書かれていませんし、私の個人的な偏見かもしれませんが、ラムダをデリゲート変数に代入するよりも、通常の関数構文の方が見栄えが良いように思います。また、ローカル関数の方がより簡潔です。
比べてみてください。
int add(int x, int y) => x + y; Func<int, int, int> add = (x, y) => x + y;
関連
-
[解決済み] UnityでOnCollisionEnterが呼ばれない
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み] メソッドと関数の違いは何ですか?
-
[解決済み] リスト内包とラムダ+フィルタの比較
-
[解決済み] クロージャ」と「ラムダ」の違いは何ですか?
-
[解決済み] Distinct() with lambda?
-
[解決済み] ラムダ(関数)とは何ですか?
-
[解決済み】JavaScriptの関数にデフォルトのパラメータ値を設定する
-
[解決済み】C++11のラムダ式って何?
-
[解決済み】関数の前のエクスクラメーションマークは何をするのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する