質問: パラメーター名の反映:c#ラムダ式の乱用または構文の輝き? mvccontrib グリッドコンポーネントを見て、 グリッド構文 で使用される構文上のトリックに魅了されましたが、同時に反発しました。.attributes(style => "width:100%") 上記の構文は、生成されたhtmlのスタイル属性をwidth:100%に設定します。ここで注意を払えば、「スタイル」はどこにも指定されず、式のパラメーターのnameから推定されます!私はこれを掘り下げなければならず、「魔法」が発生する場所を見つけました:hash(params func<object, tvalue>[] hash) { foreach (var func in hash) { add(func.method.getparameters()[0].name, func(null)); } } 実際、コードは正式なコンパイル時のパラメーター名を使用して、属性の名前と値のペアの辞書を作成しています。結果として得られる構文コンストラクトは確かに非常に表現力豊かですが、同時に非常に危険です。ラムダ式の一般的な使用により、副作用なしで使用されるnamesを置き換えることができます。本にcollection.foreach(book => fire.burn(book))と書かれている例があります。コードにcollection.foreach(log => fire.burn(log))と同じことを意味すると書くことができます。しかし、ここのmvccontrib grid構文は突然、私は自分の変数に選択した名前に基づいて積極的に調べて決定を下すコードを見つけました!それでは、c#3.5/4.0コミュニティとラムダ式愛好家とのこの一般的な慣習はありますか?それとも、私が心配するべきではない不正な1つのトリックマーベリックですか?
回答: このコードは非常に巧妙ですが、解決するより多くの問題を引き起こす可能性があります。指摘したように、パラメーター名(スタイル)とhtml属性の間にあいまいな依存関係があります。コンパイル時のチェックは行われません。パラメーター名の入力ミスがあった場合、ページにはおそらくランタイムエラーメッセージは表示されませんが、論理バグを見つけるのははるかに難しくなります(エラーはありませんが、不正な動作)。より良い解決策は、コンパイル時にチェックできるデータメンバーを持つことです。したがって、これの代わりに:.attributes(style => "width:100%"); styleプロパティを持つコードは、コンパイラでチェックできます。.attributes.style = "width:100%"; あるいは:.attributes.style.width.percent = 100; これはコードの作成者にとってはより多くの作業ですが、このアプローチはc#の強力な型チェック機能を利用しており、そもそもバグがコードに侵入するのを防ぎます。