2010-12-11 8 views
3

Dites que j'ai une classe appelée Composite qui contient une collection d'une autre classe Component, qui ont tous la propriété Name. Serait-il préférable d'utiliser un Dictionary pour stocker les composants, ou serait-il préférable d'utiliser un objet dynamique.Dynamique vs Dictionnaire [C#]

Par exemple, serait-il préférable de le faire:
Component component = someComposite.Components["RandomComponent"];
ou ceci:
Component component = someComposite.Components.RandomComponent;

Où someComposite.Components est dynamic dans le second exemple.

Le second cas semble être plus agréable, mais il n'y a pas de sécurité de type ...

Je veux ajouter que, à un moment donné, je vais finir par faire ceci:
DerivedComponent component = someComposite.Components["RandomComponent"] as DerivedComponent;
Dans ce cas dynamic peut sauver moi taper la conversion.

Alors, quel est le meilleur design?

Répondre

3

Je veux ajouter que à un moment donné, je vais finir par faire ceci: composant DerivedComponent = someComposite.Components [ "RandomComponent"] comme DerivedComponent; Dans quel cas dynamique peut me sauver en tapant la conversion .

Dans un langage statiquement typé, ces types sont là pour une raison ; ne les jetez pas simplement à cause d'un peu de syntaxe supplémentaire que vous devez mettre. Cette syntaxe est là comme un avertissement - "Hey, je fais quelque chose qui n'est pas sécurisé ici!" En fin de compte, tout se résume à des coûts par rapport aux avantages. Vous pouvez soit avoir l'avantage supplémentaire de sécurité de type, invocation statique, l'EDI vous aider lorsque vous refactoriser ... ou vous pouvez vous économiser un peu de frappe (qui est un peu comme de la documentation).


En outre, vous devez penser aux conditions d'erreur. Avec un dynamic, votre code sur les erreurs ressemblera à ceci si l'objet ne contient pas cette définition:

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

Par rapport à:

try 
{ 
    var c = obj["RandomComponent"] as DerivedComponent; 
    if (c == null) 
     // deal with error... 
    return c; 
} 
catch (KeyNotFoundException) 
{ 
    // do something here... 
} 

Cela ne semble pas que vous vous sauver réellement que beaucoup en tapant.

+0

C'est plus comme ça - merci pour l'explication. – YellPika

6

Peut-être que c'est juste moi, mais je vois dynamic plus comme un moyen pratique de gérer COM interop et d'interagir avec des langages dynamiques tels que IronPython. dynamic ne devrait pas vraiment être utilisé dans un programme tout-C#.

Utilisez un Dictionary<string, Component>. Et jetez un oeil à System.ComponentModel (c'est-à-dire les interfaces IContainer et IComponent).

+3

Alors pourquoi ne devrais-je pas utiliser dynamiquement? Vous m'avez donné des informations sur où l'utiliser, mais pas pourquoi ne pas l'utiliser ailleurs ... – YellPika