[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() で落ちてしまうようなソースにならないよう、はじめにちゃんと考えるべきなのだろう。

このブログの人気の投稿

コピーした行の挿入が表示されない時はフィルタされていないかチェック

Excel で一部の図形だけ固定する