2

Reflection の使用を控えるようアドバイスを受けました。本当に知りたかったのですが、Reflection が高価だからですか? そうでない場合、使用を避ける理由は何ですか?

私の現在および将来のプロジェクトでは、特定のクラス (メンバー情報) にアクセスする必要があるかもしれません。フィールドとプロパティ - 値または宣言名をリストする必要がある場合があります。

だから私が知りたいのは、次のとおりです。

リフレクションはどのように機能しますか? どうやって情報にたどり着くの?(簡単な説明で十分です)

また、アプリケーションでリフレクションを使用することがあまり推奨されないのはなぜですか? フィールドまたはプロパティの値または名前である必要な情報を取得する必要がある場合は、System.Reflection を使用しないでください。

いくつかの背景。

私の現在のプロジェクト(たとえば)での使用法は、特定のSQLサーバーのテーブル列名、またはSQLテーブル名をリストすることです。

として返す他の方法を考えることができましたList<strings>

を使用することがなぜ、またはどのように「悪い」のかを本当に知っていればreflection

..(この特定のシナリオでは)別のアプローチを見つけることができるので、本当にそれを避けたい場合は、決定を下すことができます。

私が本当にリフレクションを避ける必要がある場合は、テーブル名のリストが必要なときはいつでも(好ましくない)データベースにアクセスするか、一度(データにアクセスして)それをテキストファイルまたはxmlに保存することができます。

もっとエレガントなものも知っています。しかし、それは問題ではありません。(繰り返しますが、他にも多くのユースケースがある可能性があるため、これは単なる例です。おそらくそれを知っているでしょう。)

アップデート

この質問は閉じられました。再開するのを手伝ってください。下で「再開」に投票してください

ありがとう 。

4

3 に答える 3

9

CLR アセンブリ (実行可能またはダイナミック リンク ライブラリ) には、通常、その構造に関するメタデータが含まれています。これは、型、構造、メソッド、フィールド、それらの名前、および「従来の」言語では必要だったその他の情報に関する情報を意味します。通常は失われ、オフセットとサイズ情報のみに置き換えられます。

リフレクションは強力なツールであり、一部の (通常は高度な) ことはリフレクションを使用してのみ達成できます。ただし、セキュリティとカプセル化に関する懸念も生じます。これは、プログラム (または他のプログラム) の一部の実装に依存し始めるためです。通常はそれらを避け、それらの部分が提供するインターフェイスを信頼する必要があります。もう 1 つの懸念事項はパフォーマンスです。この種の (最終的にはテキストの) 情報すべてにアクセスするために、プログラムの速度が低下するためです。たとえば、リフレクションを使用してポリモーフィズムを再実装し、仮想メソッド テーブルをバイパスできます。しかし、後者は前者より何倍も高速です。

必要な場合はリフレクションを使用しますが、必要がない場合は使用しないでください。これは非常に強力なツールの 1 つであり、使用しないようにアドバイスする人もいますが、自分が何をしているのかを本当に理解している場合は、使用してもかまいません。そうは言っても、リフレクション手法を間違った方法で使用すると、上記の問題が発生するだけでなく、コードの保守が大幅に難しくなる傾向があることに注意してください。

于 2012-12-12T19:25:39.127 に答える
2

「リフレクションを使用しない」という単純なものであれば、リフレクションはまったくありません。

リフレクション遅いため、慎重に使用する必要があります。多くの場合、インターフェースやデリゲートなどを使用して目標を達成する (設計とパフォーマンスの両方の点で) より優れたソリューションがあります (依存性注入と動的型が思い浮かびます)。

リフレクションなしでオブジェクト指向設計を使用して問題を解決する方法を見つけてください。本当にリフレクションを使用する必要がある場合は、そのパフォーマンスがアプリケーションに与える影響を考慮し、それに応じて設計してください。

于 2012-12-12T19:21:32.603 に答える
0

リフレクションは、クラスの型情報を解析することによって機能します。計算コストが高いため、控えめに使用してください。

于 2012-12-12T19:22:45.827 に答える