メソッドがインライン化する可能性があります。それを防ぐ属性があります(「それにはattがあります」)。しかし、明らかに、メソッドは、JITter(http://www.hanselman.com/blog/ReleaseISNOTDebug64bitOptimizationsAndCMethodInliningInReleaseBuildCallStacks.aspx)によるテールコール最適化のために、x64上に独自のスタックフレームを取得しない可能性があります。これはMethodBase.GetCurrentMethod
の動作に影響しますか?MethodBase.GetCurrentMethodはいつ信頼性が高い/予測可能ですか?
私が見つけることができる議論は主にインライン化(When is a method eligible to be inlined by the CLR?)です。これらの議論はそれ自体が興味深いものですが、私の問題は実際には、MethodBase.GetCurrentMethod
が、プログラマーがコールをしたのと同じ方法を特定するために頼ることができる状況があれば(例えば、メソッドへのレイトバインディング現在の方法は実際に代理人です)。インライン化は、MethodBase.GetCurrentMethod
がだまされる可能性がある方法ですが、それが唯一の方法かどうか疑問に思っていますか?
これは、テールコールの最適化とは異なり、単にforループへの再帰呼び出しを書き換えます。メソッド* always *には、コードセキュリティと例外に必要なスタックフレームがあります。メソッドがインラインになると、呼び出し元メソッドの名前が取得されます。 GetCurrentMethodは非常に高価であり、単にメソッド名をコードに書き込むためにキャンドルを保持できないことに注意してください。インライン化の問題もそれ自身で解決されます。 –
@Hans、x64のテールコールの最適化については、こちらをご覧ください:[link](http://www.hanselman.com/blog/ReleaseISNOTDebug64bitOptimizationsAndCMethodInliningInReleaseBuildCallStacks.aspx)あなたのコメントは立っているかもしれませんが、その例では再帰を見ていません。遅延結合シナリオでは、サロゲートは、代理への後続の呼び出しが再び反映する必要がないように、動的代理人を構築してキャッシュします。したがって、パフォーマンスは主な考慮事項ではありません。むしろ信頼性は(コード中のメソッド名の埋め込みは、メソッドの名前が変更された場合、信頼性問題の影響を受け易い)。 –
私はちょうど私に起こりました。私は 'GetCurrentMethod'(信頼性がない)やコードにメソッド名を文字列として埋め込むことは必要ありません(自動的にタイプミスやリネームを処理しません)。代わりに、メソッドを呼び出す式を埋め込むことができます。しばらくの間、私はプロパティの参照のためにこれを行ってきました。同じテクニックをメソッドに適用することを考えるのがなぜそんなに長い時間がかかったのか分かりません。 –