2012-05-01 5 views

答えて

6

私はバグだとは思っていませんが、コンパイル時にリフレクションを介してクラスの内部にアクセスすることは常に可能でした。これは設計によるものです。 CLRの多くの側面は、シリアル化などのフィールドにアクセスするためのリフレクションに依存しています。コンパイルされたILはすべてのオブジェクトのすべてのフィールドにアクセスできる必要があります。そうしないと、プライベートフィールドをからに設定できませんでした。

C#のアクセス修飾子はセキュリティメカニズムではありません。誰かが外部からそれを設定するのを防ぐためにプライベートなフィールドに頼っているのであれば、あなたは何か間違っているのです。あなたのクラスのどの部分が、実装の詳細である(したがって、予告なしに変更することができる)公的な契約である(したがって、理論上は安定している)ことを明確に描写しています。

リフレクションを使用する場合オブジェクトの内部状態を変更してください。アプリケーションの安定性を自分の手に取っていて、価値があるものが得られます。

+1

私はそれがセキュリティの仕組みではないとは確信していません。部分的に信頼できるコードが他のタイプのプライベートメンバーにアクセスできない理由があります。 – svick

+0

良い答え.... – MarkP

0

リフレクションはフルトラストコードに対してのみ許可されているので、コードはすでに何かを行うことができます(プロセスのメモリに直接ポンピングするなど)。したがって、プライベートプロパティでも値を変更する方法をサポートしていても、コードの安全性は低下しません。リフレクションAPIの一貫性を保ち、特にテストのための有用なシナリオを可能にします。

関連する問題