2009-03-11 11 views
1

私は現在、各ノードが別のものと同等であるかどうかを知ることができるノードのツリー構造に取り組んでいます。各ノードクラスは、QueryNodeのサブクラスです。 が同等かどうかを確認するために、彼らは同じサブクラスのものであり、同等のメンバー値を持っている場合、ノードは、比較(関係するより多くの事があるのです、もちろん、これはバグ私をその一部です):私はこれがないかもしれないと感じこのC#コードの型チェックの代替方法はありますか?

class VersionNode : QueryNode 
{ 
    VersionModifier m_versionModifier; 

    internal VersionModifier VersionModifier 
    { get { return this.m_versionModifier; } } 

    // ... 

    protected override bool AreMembersEquivalent(QueryNode other) 
    { 
     VersionNode otherNodeAsVersionNode = other as VersionNode; 

     if (otherNodeAsVersionNode == null) 
      return false; 
     else 
      return (this.m_versionModifier == otherNodeAsVersionNode.VersionModifier); 
    } 
} 

キャスティングが必要なため、最適な解決策になります。これを行うよりエレガントな方法はありますか?

+0

、あなたのタブのサイズは2つのスペースを作る場合は、コードをより「エレガント」になりますし、ローカル変数名を短くします。 – leppie

+0

あなたは他のインスタンスのm_versionModifierに直接アクセスできます。プロパティを経由する必要はありません:) 'this'も不要です。 – leppie

+0

私はPaul GrahamのAnsi Common Lispを読んでからスタイリッシュなものを探すのに冗長なコードを好む。 –

答えて

2

短い答えはノーです。キャスティング(さらにある程度のアンボックス化も)は高価ではありません。

0

私は、奇妙なキャストはあなたを傷つけることはないと確信しています。物理学モデリングは何をしていますか?

あなたが行うことができ
+0

データベースクエリに対するマイナーな最適化のテストを作成します。ご協力いただきありがとうございます! –

+0

ええ、この種のものは赤いニシンです。あなたの本当の利益は他のところにあります。 – Quibblesome

1

protected override bool AreMembersEquivalent(QueryNode other) 
    { 
     if (!(other is VersionNode)) 
      return false; 
     ... 
} 
+0

このプロパティにアクセスするには、「他」をVersionNodeとして操作する必要があるため、ここでは役に立ちません。安全なキャストas "as"は良い方法です。 –

+0

あなたが続けるなら、とにかくそれをキャストしなければならないと約束しました。代わりにそれを投げ捨てるだけです。面白いのは、 'is'と 'as'演算子は実際にisinst IL演算子として実装されているため、実際には違いはありません。 –

0

それはよりエレガントではないが、それはおそらくより明確です:

protected override bool AreMembersEquivalent(QueryNode other) 
{ 
    if (GetType() == other.GetType()) 
    { 
     return (VersionModifier == other.VersionModifier); 
    } 
    return false; 
}  
+0

そして継承のために働かない。 – leppie

+0

どういう意味ですか?このコードは、QueryNodeから継承する2つのオブジェクトの型が同じかどうかを示します。 –

関連する問題