前置き §
「今回は暗黙的にC#の型名で説明するよ」
「じゃあC#の話って言えばいいじゃん」
「話そのものはC#に限定されない話題なんだ」
「型の名前だけC#準拠にしているだけってことだね」
型を指定しよう §
型を指定するとメモリを節約できます。たとえば整数型のintは32bitですが、255までの数値で十分と分かっている時はbyte型を指定すると8bitで済み、メモリを制約できます。逆にいえばメモリが十分ならint型を使っても構いません。
ちょっと待ったその解釈! §
「やっぱりメモリは節約だよね。型指定を活用してメモリを節約するよ」
「うむ。良い心がけだ」
「でもこのプログラムはそれほど大量のメモリを確保しないから型指定はルーズでもいいよね」
「ちょっと待った!」
「何でだよ」
「型がメモリ節約のために手段で、節約の必要がない時は厳密に指定しなくてもいいなんて誰が決めた」
「は?」
「では問う。intとuintとfloatはなぜ存在するんだ?」
「符合あり整数と符号無し整数と単精度浮動小数点実数だろ?」
「でも全部32bitだぞ。この3つを使い分けてもメモリ節約にならないぞ」
「あれ?」
「型というのはビット幅だけを規定しているわけではないんだ。値の性質も規定しているわけ。だからintとuintは絶対に小数点以下の値を持てない。そしてuintはマイナスの数を持つことができないわけだ」
「それにどんな意味があるの?」
「間違った値の代入を抑止できる場合がある」
「うそー」
「たとえば、間違って違う目的の変数の値を代入するコードを書いてしまったとすると、データ型がもつ性質が噛み合わなければエラーになって問題に気付くチャンスが得られるかも知れない。それらは型を指定するメリットだが、メモリ節約とは違う目的で使用される型だ」
「ええと、問題に気付くチャンスが得られるかも知れないってことは、得られないかもしれないってこと?」
「単純に数値のレンジだけの問題ならそうだな」
「得られないのはどういうとき?」
「たとえば、符号無しの8bitの整数を符合ありの32bitの整数に代入すると成功してしまうかもしれない。数値のレンジが失われることはないので、問題とは見なされないかもしれない。でも、型の不整合はバグを意味する可能性もある」
「不確かなら型なんてどうでもいいじゃん」
「不確かでも一部のバグは確かに検出できるんだ。それだけバグが減れば全体の時間の節約になるよ」
「でも全部のバグを検出できるわけじゃないんだろ?」
「あのね。全部コンパイラが検出してくれたら君の活躍する出番も無くなるってことだよ」
「それは大変だ! さっそく型をちゃんと指定してバグを調べるよ」