インスタンスがタイプかどうかを確認します


181

これを使用してcのインスタンスかどうかを確認しますTForm

c.GetType().Name.CompareTo("TForm") == 0

stringparamとして使用する以外に、タイプセーフな方法はありCompareTo()ますか?


20
Javaでもそのようにしないでください。これを行うには、Java instanceofとC#のis方がはるかに優れています。
Powerlord 2010

回答:


410

ここでの異なる答えには、2つの異なる意味があります。

あなたは、インスタンスがであるかどうかを確認したい場合は、正確なタイプ、その後

if (c.GetType() == typeof(TForm))

行く方法です。

cがインスタンスTForm またはサブクラスのどちらであるかを知りたい場合は、is/ を使用しますas

if (c is TForm)

または

TForm form = c as TForm;
if (form != null)

これらの動作のどれが実際に必要かについて、頭の中で明確にしておく価値があります。


7
ちょっとしたメモ:キャストの結果を使用したくない場合は「is」を使用し、使用したい場合は「as」を使用します。
Aviram Fireberger 2015年

14
C#7を使用すると、組み合わせることができますisし、asパターンマッチングに:if (x is TForm tf) {…
リチャード・

39
if(c is TFrom)
{
   // Do Stuff
}

または、cとして使用する予定の場合TFormは、次の例を使用します。

var tForm = c as TForm;
if(tForm != null)
{
   // c is of type TForm
}

2番目の例でcは、タイプがTForm1つであるかどうかを確認するだけです。あなたがチェックするとwhereisはが表示された場合は、場合c型であるがTForm、それをキャストし、CLRは、余分なチェックを受けます。こちらが参考です。

編集:ジョン・スキートから盗まれた

あなたが確認する場合cであるTFormから継承任意のクラスではなくTForm、その後の使用、

if(c.GetType() == typeof(TForm))
{
   // Do stuff cause c is of type TForm and nothing else
}

14

はい、「is」キーワード:

if (c is TForm)
{
    ...
}

MSDNの詳細を参照してください:http : //msdn.microsoft.com/en-us/library/scekt9xw(VS.80).aspx

オブジェクトが指定されたタイプと互換性があるかどうかを確認します。たとえば、オブジェクトが次のような文字列型と互換性があるかどうかを判断できます。


10

また、同じように

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オペレーターに似ています。
SkidRunner 2016年

それらが継承階層の同じブランチにないが変換演算子が存在する場合、それはfalseを与えますか?
Paul Stelian

良い質問@PaulStelian。私は頭の上から確信が持てませんが、その状況ではfalseが返されると思います。それは少なくとも私の予想される行動です。おそらく、暗黙の変換が存在する場合、trueを返す可能性がありますが、それは奇妙です。
ブラッドカニンガム

Visual Studioをインストールして試してみた人はいますか?
Paul Stelian

1
@PaulStelian-falseを返します。これはdocリンクをたどることで確認でき、変換についての言及はありません。それについて考えるための別の方法は、あるT1.IsAssignableFrom(T2)リターンtrueの状況ではas、オペレータが、これらの型のインスタンスを指定したnull以外の値を返します。
ToolmakerSteve

9

TFormとしてcを使用する場合は、他の回答よりも少しコンパクトです。

if(c is TForm form){
    form.DoStuff();
}


2

他の人が述べたように、「is」キーワード。ただし、後でそのタイプにキャストする場合は、

TForm t = (TForm)c;

次に、「as」キーワードを使用する必要があります。

例えば TForm t = c as TForm.

その後、あなたはチェックすることができます

if(t != null)
{
 // put TForm specific stuff here
}

重複チェックであるため、そのままでは組み合わせないでください。



-1
bool isValid = c.GetType() == typeof(TForm) ? true : false;

またはより単純

bool isValid = c.GetType() == typeof(TForm);

私見:私は直接の思いやりを避けます(つまり==)。特定のTypeが、たとえばsealedClass から継承されないことがわかっている場合を除いて、継承をサポートするオブジェクトまたは指向言語では。また:(静的/定数)ブール値を返す三項演算子の使用は私に迷惑をかけます、それがswitchステートメントだったとしてもそれほど気になりません。
SkidRunner 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.