パラメータ名の反映: C# ラムダ式の乱用か、構文の素晴らしさか? [closed] 質問する

パラメータ名の反映: C# ラムダ式の乱用か、構文の素晴らしさか? [closed] 質問する

私はMvcコントリビュートグリッドコンポーネントと、そこで使用されている構文トリックに魅了されながらも同時に嫌悪感を覚えます。グリッド構文:

.Attributes(style => "width:100%")

上記の構文は、生成された HTML のスタイル属性を に設定します。ここで注意すると、「style」はどこにも指定されていません。これは、式内のパラメータwidth:100%から推測されます。私はこれを詳しく調べて、「魔法」が起こる場所を見つけました。

Hash(params Func<object, TValue>[] hash)
{
    foreach (var func in hash)
    {
        Add(func.Method.GetParameters()[0].Name, func(null));
    }
}

したがって、このコードは、コンパイル時の正式なパラメータ名を使用して、属性名と値のペアの辞書を作成しています。結果として得られる構文構造は、確かに非常に表現力豊かですが、同時に非常に危険です。

ラムダ式の一般的な使用法では、副作用なしで使用されている名前collection.ForEach(book => Fire.Burn(book))を置き換えることができます。ある本で、コードに記述できることがわかっていてcollection.ForEach(log => Fire.Burn(log))それが同じことを意味するという例を見ました。しかし、ここでの MvcContrib Grid 構文では、変数に選択した名前に基づいて積極的に検索して決定するコードが突然見つかりました。

これは C# 3.5/4.0 コミュニティやラムダ式愛好家の間では一般的な慣行なのでしょうか? それとも、心配する必要のない、一風変わった不正行為なのでしょうか?

ベストアンサー1

名前が奇妙というよりは、ラムダが不要であるという点が奇妙だと思います。匿名型を使用すれば、より柔軟にすることができます。

.Attributes(new { style = "width:100%", @class="foo", blip=123 });

これはASP.NET MVCの多くで使用されているパターンであり、その他の用途(a警告、また注意してくださいアイエンデの考え名前が呼び出し元固有ではなくマジック値である場合)

おすすめ記事