10

c#で遊んでいるうちに、奇妙なことに気づきました。

コードは次のとおりです。

class Program
{
    static void Main(string[] args)
    {
        System.Diagnostics.Debug.Write(string.Empty);

        typeof(string)
            .GetField("Empty", BindingFlags.Static | BindingFlags.Public)
            .SetValue(null, "Tolgahan");


        Console.WriteLine(string.Empty);

        // output : Tolgahan
    }
}

リフレクションで読み取り専用フィールドを変更できるのはなぜですか?


質問は「リフレクションによる設定が許可されている理由」であり、「その方法」ではありません.

4

3 に答える 3

19

同様に、化学の法則では、反応によって1つの元素の原子が別の元素の原子に変化することはないとされていますが、物理学の法則では、常に起こるとされています。化学は、問題をより解決可能な方法に単純化するための物理学の制限されたサブセットです。

この場合、反射は物理学であり、通常のプログラミングは化学です。それはより単純な考え方で動作します。リフレクションを使用すると、その単純な一連のルールを回避して、新しいプロセスだけでなく、新しい危険にもさらされる可能性があります。

于 2012-08-30T16:09:11.340 に答える
5

readonly、のようprivateに、マキャヴェリ*ではなく、マーフィーをガードするからです。

readonly私たちはできることを制限するものをandなどを使用しprivateます。これは主に、有用で実りあるものよりも、正しくない、一貫性のない、または単に愚かなことを制限することを望んでいるためです。

しかし、それはまだ 1 と 0 です。一部のメモリが数値「42」に設定されていて、読み取り専用フィールドを介してアクセスすると、オブジェクトが作成されたときに読み取り専用ではありませんでした。コンパイラが「ねえ、最初は変更したくないと言っていましたが、今は変更しようとしているのですが、何が得られますか? これらの2つの決定のいずれかが間違っているに違いありません」というコンパイラーの発見を除いて、変更を止めるものは何もありません。

さて、リフレクションがそれを変えることができるという約束はありませんが、そうでないという約束もありません。現在、リフレクションの仕組みと読み取り専用の仕組みは、変更できることを意味します。少なくとも、おそらく私たちユーザーとその作業を実装する必要があるチームに影響を与えるコストで、多くの作業が必要になります。正当な理由。

リフレクションに関連するパーミッションはマキャベリを止めることに注意してください。

*厳密に言えば、マーフィーは、人々が誤って何か災害を起こしてしまうのを防ぐために、どのように設計すべきかについて正確に話していました -readonlyこれは良い例です。技術。しかし、それは簡潔なことわざほどどこにもありません。

于 2012-08-30T17:15:04.670 に答える
0

これは、.Net のリフレクションがこのように実装されているために可能です。この理由は推測するしかありませんが、これは強力な (しかし遅い) ツールであり、優れた柔軟性と誤用の可能性を提供します。

そのような変更を達成できる唯一の方法ではありませんが、そのような議論はトピックから外れており、さらなる主観的な推測と同様に場違いです.

于 2012-08-30T16:24:37.513 に答える