回答:
ここでの異なる答えには、2つの異なる意味があります。
あなたは、インスタンスがであるかどうかを確認したい場合は、正確なタイプ、その後
if (c.GetType() == typeof(TForm))
行く方法です。
c
がインスタンスTForm
またはサブクラスのどちらであるかを知りたい場合は、is
/ を使用しますas
。
if (c is TForm)
または
TForm form = c as TForm;
if (form != null)
これらの動作のどれが実際に必要かについて、頭の中で明確にしておく価値があります。
is
し、as
パターンマッチングに:if (x is TForm tf) {…
if(c is TFrom)
{
// Do Stuff
}
または、c
として使用する予定の場合TForm
は、次の例を使用します。
var tForm = c as TForm;
if(tForm != null)
{
// c is of type TForm
}
2番目の例でc
は、タイプがTForm
1つであるかどうかを確認するだけです。あなたがチェックするとwhereisはが表示された場合は、場合c
型であるがTForm
、それをキャストし、CLRは、余分なチェックを受けます。こちらが参考です。
編集:ジョン・スキートから盗まれた
あなたが確認する場合c
であるTForm
から継承任意のクラスではなくTForm
、その後の使用、
if(c.GetType() == typeof(TForm))
{
// Do stuff cause c is of type TForm and nothing else
}
はい、「is」キーワード:
if (c is TForm)
{
...
}
MSDNの詳細を参照してください:http : //msdn.microsoft.com/en-us/library/scekt9xw(VS.80).aspx
オブジェクトが指定されたタイプと互換性があるかどうかを確認します。たとえば、オブジェクトが次のような文字列型と互換性があるかどうかを判断できます。
また、同じように
Type.IsAssignableFrom(Type c)
「cと現在のタイプが同じタイプを表す場合、または現在のタイプがcの継承階層にある場合、または現在のタイプがcが実装するインターフェースである場合、またはcがジェネリックタイプパラメータであり、現在のタイプである場合は真cの制約の1つを表します。」
ここから:http : //msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx
typeof(Class).IsAssignableFrom(object.getType())
Java instanceof
オペレーターに似ています。
T1.IsAssignableFrom(T2)
リターンtrue
の状況ではas
、オペレータが、これらの型のインスタンスを指定したnull以外の値を返します。
bool isValid = c.GetType() == typeof(TForm) ? true : false;
またはより単純
bool isValid = c.GetType() == typeof(TForm);
==
)。特定のTypeが、たとえばsealed
Class から継承されないことがわかっている場合を除いて、継承をサポートするオブジェクトまたは指向言語では。また:(静的/定数)ブール値を返す三項演算子の使用は私に迷惑をかけます、それがswitch
ステートメントだったとしてもそれほど気になりません。
instanceof
とC#のis
方がはるかに優れています。