2012-02-16 5 views
8

oNode *であるかどうかをチェックし、そうであればdのメソッドを呼び出します。C++のdynamic_castに相当するC#とは何ですか?

if (Node * d = dynamic_cast<Node *>(o)) d->do_it(); 

同等のものをC#で書くには、どのような方法が最短かつ/または最も効率的ですか?代わりに、それは、その後structあなたがC#でisキーワードを使用することができ、この

if (o is Node) { 
    ((Node)o).do_it(); 
} 

答えて

20

は、次

Node d = o as Node; 
if (d != null) { 
    d.do_it(); 
} 

を行います。 oNodeない場合

if (o is Node) 
{ 

} 
+0

、それに(as' 'の有効性の点で)構造体とクラスの違いの1を私にビート –

+0

なぜ参照型に "is"演算子を使用しないのですか? 'if(oはノード){(oはノードとして).do_it();} } ' –

+0

@JohnRuizあなたができなかった理由はありません。実際には、Nodeが構造体であるかクラスであるかに関係なく、2番目のメソッドは動作します。 – Servy

0

を試みるならNodeclassであると仮定すると

+7

実際に 'is'はキャストしません。 'is'は型をチェックするだけです。 –

1

asオペレータはnullを返します:

Node d = o as Node; 
if (d != null) 
{ 
    d.do_it(); 
} 
+1

Nodeが 'struct'でない限り、コンパイルされません。 –

+1

彼が投稿したコードで判断すると、クラスのように参照型と同様にポインタを使用します。さらに、C#の構造体はほとんど使用されません。 –

+0

理論では真ですが、C++では 'struct'と' class'はポインタを持つことができます。ノードのために 'struct 'が使用されている可能性があります。 –

関連する問題