2011年06月04日
川俣晶の縁側ソフトウェア技術雑記total 9051 count

C#によってstring.Emptyの値を上書きする悪夢の方法

Written By: 川俣 晶連絡先

 偶然、http://twitter.com/#!/neuecc/statuses/76605738260242432というページを見てしまったので、C#で通るように書き直して検証してみました。

using System;

class Program

{

    static void Main(string[] args)

    {

        Console.WriteLine(string.Empty);

        typeof(string).GetField("Empty").SetValue(null, "New Empty Value");

        Console.WriteLine(string.Empty);

    }

}

実行結果 §

(空行)

New Empty Value

 というわけで、readonlyだから変更できないというわけでも無いようです。リフレクションでイチコロ。

 しかし、まだまだ甘かった。検証中に気付いてしまいました。

更なる悪夢 §

using System;

class Program

{

    static void Main(string[] args)

    {

        typeof(string).GetField("Empty").SetValue(null, "New Empty Value");

        Console.WriteLine("{0}","");

    }

}

実行結果 §

New Empty Value

 はい。Mainメソッドの1行目で確かにEmptyの値は上書きしていますが、2行目の出力にstring.Emptyは一切関与していません。しかし、書き換えた値が使用されています。実はこれ、値の問題なので変数を経由しても同じ事です。つまり、以下のように書いても結果は同じ。

using System;

class Program

{

    static void Main(string[] args)

    {

        typeof(string).GetField("Empty").SetValue(null, "New Empty Value");

        string s = "";

        Console.WriteLine("{0}",s);

    }

}

 .NET Frameworkのフォーマット機能がどのような実装になっているか知りませんが、けっこうホラーな話です。

 とりあえず、いくら書き換えられても特定の値が期待されているフィールドは変えるべきではないのでしょう。

ちょっとだけ考察 §

 readonlyは実は読み出し専用では無く、書き換えられます。初期化とコンストラクタからであれば、いくらでも違う値を入れられます。そこがconstと違うところ。だから、readonlyでも書き換える手段はあるのかもしれませんが、おそらくconstには無いでしょう。

Facebook

キーワード【 川俣晶の縁側ソフトウェア技術雑記
【技術雑記】の次のコンテンツ
2011年
06月
09日
Windows Phone Developer Dayの感想
3days 0 count
total 3866 count
【技術雑記】の前のコンテンツ
2011年
06月
01日
Visual Studio 2010で作成したWebサービス(.asmx)で、HttpRequestValidationException例外を抑止する方法
3days 0 count
total 6572 count

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

https://mag.autumn.org/tb.aspx/20110604154409
サイトの表紙【技術雑記】の表紙【技術雑記】のコンテンツ全リスト 【技術雑記】の入手全リスト 【技術雑記】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.36 (Alpha-Test) Copyright (c) 2004-2021 Pie Dey.Co.,Ltd.