2011年12月16日金曜日

いまさらな C# string クラス

ご存じだろうか?
C# の string (String のエイリアスなので同じもの) 型の変数に関するあれこれ。


実は、文字列の終端はヌル文字ではないんです!


「何と!」


ということは文字列の途中ヌル文字座ってたりします。


なので以下のような C ちっくなコードはデンジャラスです。


string str = "あれやこれや";

int lp = 0;
while (true)
{
    if (str[lp] == '\0') break;


    // ...なんやかんや


    lp++;
}


まぁこれはちょっと無理矢理すぎた感があるが...
普通はクラスプロパティの Length 見るだろうからこういう問題には当たることは無いだろう


ただし、C から移行で、ポインタ変数バリバリ使ってた注意必要


おぅおぅ! C# にはポインタないのかえ


なんてほざいて色々調べたら出来ることが分かってわざわざ使ってます
みたいな?
そういう人たち気をつけないとダメです。
というか、C# 以下のようなする意味あんのか


unsafe private void test()
{
    char[] str = "いろはにほへと".ToCharArray();


    fixed (char* pnt = &str[0])
    {
        char* ptr = pnt;
        while (*ptr != '\0')
        {
            // なんやかんや
            ptr++;
        }
    }
}


怖いくらいまんま C なってる...おそろしや...


まぁポインタ使うには上記ように、unsafe やら fixed やらを使って
「今からあっしはポインタを使いまっせー!」
と内外に宣言しないといけないようだし、殆どの人たちは
「めんどくさっ!」
と、今後一切使わなくなるでしょう。


ただ、どの世界にも異端児(変態)はいるもので、そういう人たちのためにあるようだ。


しかし面白いのは、その変態たちと C# の開発者たちとの攻防がくっきりと見えるところか。