Pages

2013/07/05

[C#] オブジェクトの型チェック

Object 型の型チェックは様々な方法があるが、is で判定する方法がよくとられる。
object obj = null;
if (obj is string)
{
}
// false
空文字か null かのチェックをするケースもよくするが、うっかりこう書いてしまうと危険だ。
object obj = null;
if (string.IsNullOrEmpty(obj.ToString()))
{ 
 // 例外が発生する。
}
これは null を参照してしまうケース。
ToString() の対象となる変数が null であるため、ToString() メソッドにアクセスできないためだ。

参照型であるなら、as でキャストする方法もある。
これはチェック目的というよりも、とりあえず値を変換したい場合か。
object obj = null;
string s = obj as string;
// s = null
変換できない場合、代入先の変数には null になる。

as は int などの値型には使用できない。
で、TryParse を使おうとすると、TryParse は string 型の引数しか取れないことにぶち当たる。
ToString() などとやってしまうと……例外が発生する可能性がある。ならば Convert なら。Convert ならなんとかしてくれるはずだとこう書く。
object obj = null;
int i;
if (int.TryParse(Convert.ToString(obj), out i))
{
}
Convert は変換できない場合は勝手に空文字にしてくれる。
しかし、何をやりたいのかわからなくなってくるw

結局、型のチェックをするという構造自体まず避けるべきだし、チェックをかけるなら is で。
また、キャストも色々と方法があるが、ToString() で落ちてしまうようなソースにならないよう、はじめにちゃんと考えるべきなのだろう。
Related Posts Plugin for WordPress, Blogger...