2012-03-25 7 views
7

部分的には不思議なものから見て、部分的には潜在的な問題から保護しています。以下の呼び出しによって起こることができる最悪のあるものを想像して(または類似した何かを、しかしstring.Emptyは良い例です):x = myClass.bar ?? string.Emptyを行うコードのどこかがあるときString.Emptyの値を変更しないようにする

typeof(String).GetField("Empty", 
    BindingFlags.Public | 
    BindingFlags.NonPublic | 
    BindingFlags.Static | 
    BindingFlags.GetField 
).SetValue(null, "foo"); 

これが問題を引き起こします。

String.EmptySqlDateTime.MinValue(または.NETの他の同様の読み取り専用フィールド)のような値を変更しているユーザーに対して保護する(または検出する)方法はありますか。

+0

関連する? http://stackoverflow.com/questions/4447939/is-it-possible-to-disable-reflection-from-a-net-assembly – harold

+6

信頼できるコードが悪いことをするのを防ぐことはできません。また、信頼できないコードでは 'string.Empty'を変更できません。そして、この場合、足に自分自身を撮影することはかなり明白です。 – CodesInChaos

+1

ところで、Int.MaxValueはa * constant *フィールドではありませんか? – harold

答えて

5

あなたはそうのようなあなたアセンブリで独自のconstフィールドを定義することができます。

internal const string Empty = ""; 

そしてString.Emptyに対してチェックを行うが、それはかなり賽の河原です。

String.Emptyにアクセスして、効果的に置き換える必要があります(比較の際にチェックするので、あなたのバージョンよりも実際にString.Emptyを使用しても意味がありません)。

それはconstなので、値が良いである、変更することができませんでしたが、String.Emptyの値がが今まで(ただしそう)を変更しない場合は、同時に、あなたはに変更を加える必要があります値を入力し、すべてのフィールドを参照するすべてのを再コンパイルします。

もちろん、あなたのバージョンはreadonlyにすることができますが、リフレクションによって値が変更されてしまう可能性があります。

String.Emptyが変更された場合だけでなく、フィールドに対する比較が影響を受けるということに事実を追加し、私はちょうど正しく動作しないでしょうBCLのメソッドの途方もない数を想像

。リフレクターを見、mscorlibに数百倍(.NET 4.0)のみ を参照しています思わ:

、あなたがを試してみて、価値がなかったことを保証することができると言いましたので

references to String.Empty in mscorlib 4.0

変更されましたが、実用的ではありません(それは猫と猫の永遠のゲームになります)、あなたのプログラムの観点から、String.Emptyの値が変更された場合、世界は終了し、プログラムそれが変わるとすぐに恐ろしい死がかなり早く死ぬでしょう。

関連する問題