型を比較、または検証する場合、String で評価しない方が良いです。
型名での比較は、型を評価しているわけではなく、文字列を評価しているに過ぎません。
いくつかの言語で、その例を紹介します。
C#
if (obj.GetType().Name == "Label") {
MessageBox.Show("Label です");
}
VB.NET
Select Case obj.GetType().Name
Case "Label"
MessageBox.Show("Label です");
Case "TextBox"
MessageBox.Show("TextBox です");
End Select
VB [VB6]
Select Case TypeName(obj)
Case "Label"
Call MsgBox("Label です")
Case "TextBox"
Call MsgBox("TextBox です")
End Select
これらは、文字列の検証に過ぎず、型に関して「コンパイル解決」していません。
実行時まで、型自体の有効性がわからないわけです。(存在しないかもしれない、typo しているかもしれない)
また、型の検証は、互換性を見るために行うことが殆どでしょう。
文字列の比較では、同一の "型名" であるかどうかしか検証できません。
継承階層上で互換性のある型の検証ができません。(TextBox は TextBoxBase と互換性がある)
また、(普通はないですが) たまたま同名の型で、互換性がなかった場合はバグになります。
C# では is を、VB では TypeOf ~ Is を、J# では instanceof などを使うようにしましょう。
(C# については、as、typeof、VB については、GetType 演算子についても見るようにしてください)
C#
if (obj is Label) {
MessageBox.Show("Label と互換性のあるクラスです");
}
VB
If TypeOf obj Is Label Then
MessageBox.Show("Label と互換性のあるクラスです");
End If
J# [Java]
if (obj instanceof Label) {
MessageBox.Show("Label と互換性のあるクラスです");
}
もっとも、型の検証を避けるような仕様 / 実装にするのが賢明です。
(ポリモーフィズムという観点で見ると、微妙な言い回しですが)