2010-12-11 10 views
3

他のクラスComponentのコレクションを含むCompositeというクラスがあります。これらのクラスはすべてプロパティNameです。コンポーネントを格納するためにDictionaryを使用する方が良いか、動的オブジェクトを使用する方が良いでしょうか。動的対辞書

例えば、これを行う方が良いでしょう:
Component component = someComposite.Components["RandomComponent"];
またはこの:someComposite.Componentsは第二の例ではdynamicある
Component component = someComposite.Components.RandomComponent;

を。

私はいくつかの点で私はこれを行うことになりますことを追加する2番目のケースは、よりよいようだが、ないタイプの安全性はありません...

dynamicを保存することができ、その場合には
DerivedComponent component = someComposite.Components["RandomComponent"] as DerivedComponent;
私は変換をタイピングします。

だから、これはよりよい設計のですか?

答えて

3

: DerivedComponentコンポーネント= someComposite.Components [ "RandomComponent"] DerivedComponentとして を。この場合、 のダイナミックで、 の変換を入力する手間が省けます。

静的型付き言語では、これらの型はの理由でです。あなたが置かなければならない余分な構文の少しのためにそれらを放棄しないでください。その文法は警告として存在します。「ねえ、ここでは型保証されていないものをやっています!最後に

、それはすべての対のメリットをコストダウンしています。静的な起動、IDE(リファクタリング時に役立つIDE)など、タイプの安全性や、タイピングの手間を省くことができます(ドキュメントのようなものです)。


さらに、エラー条件について考える必要があります。オブジェクトは、その定義が含まれていない場合dynamicで、エラーに関するあなたのコードは次のようになります。

あなたが実際にすることを自分自身を保存していることは表示されません
try 
{ 
    var c = obj["RandomComponent"] as DerivedComponent; 
    if (c == null) 
     // deal with error... 
    return c; 
} 
catch (KeyNotFoundException) 
{ 
    // do something here... 
} 

:と比べ

try 
{ 
    DerivedComponent c = obj.RandomComponent; 
    return c; 
} 
catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException) 
{ 
    // do something here... 
} 
catch (InvalidCastException) 
{ 
    // handle error 
} 

を多くのタイピング。

+0

それはもっと似ています - 説明はありがとうございます。 – YellPika

6

多分それは私だけだが、私は、COM相互運用機能に対処するためや、IronPythonのような動的言語と対話するために便利な方法としてdynamicより多くを参照してください。 dynamicは、実際にはすべてのC#プログラムで使用するべきではありません。

使用Dictionary<string, Component>

System.ComponentModel(つまりIContainerIComponentのインターフェイス)をご覧ください。私は は、このやってしまいますいくつかの点でそれを追加したい

+3

なぜ私は動的に使用しないでください。あなたはそれをどこで使うべきか私に情報を与えましたが、他の場所でそれを使わない理由はありません... – YellPika

関連する問題