インライン関数がプライベートまたは内部の値にアクセスする良い方法はありますか?
-
26-10-2019 - |
質問
私は問題に遭遇しました:インライン関数からプライベートまたは内部値にアクセスしようとすると、「値」xxx」というエラーがマークされましたが、その実装は十分にない内部またはプライベート関数を使用します。アクセス可能」。論理的ですが、誰かが周りに良いことをしているのだろうかと思います。私ができると考えることができる最善のことは、価値をネストされたモジュールに公開し、誰も突っ込んでいないことを願っています(これらの値は不変であるため、とにかく心配していません)。リフレクションはオプションだと思いますが、呼び出しをキャッシュできないと(...プライベート代表者を使用)、パフォーマンスのヒットが多すぎます。
解決
短い答え:いいえ、値はコールサイトにインラインに挿入されるため、プライベート値を使用することはできず、それを回避する本当の方法はありません。
長い答え:信じられないほどugいコードを書くことを気にしない場合、使用ごとにいくつかのメソッド呼び出しのオーバーヘッドを処理できる場合、1つの選択肢が動的実装を作成することです(例: OperatorIntrinsics.AbsDynamicTableImpl
コアライブラリで)、プライベートにすることができます。その後、動的実装を公開不透明な一般的な方法でラップできます(例: OperatorIntrinsics.AbsDynamic<'T>
)、そして、適切なタイプの制約とダイナミックな実装にdeferを追加するインライン値を作成します(例: let inline abs< ^t when ^t : (static member Abs : ^t -> ^t)> x = AbsDynamic x
)。今、あなたがインラインであるとき abs
電話が表示されます AbsDynamic
しかし、さらなる実装の詳細はありません。ほとんどの場合、私はこれがあなたの価値をプライベートではなく公開するよりもはるかに悪い解決策になると予想しています。