2010-09-26 10 views
4

j'ai écrit cette fonctionInconvénients de l'utilisation de types anonymes à la place des dictionnaires?

private string BuildXPathQuery(string prefix = "descendant::", string tag = "*", object attrs = null) 
    { 
     StringBuilder sb = new StringBuilder(prefix); 
     sb.Append(tag); 
     if (attrs != null) 
      foreach (var a in attrs.GetType().GetProperties()) 
       sb.Append(string.Format("[@{0}='{1}']", a.Name, a.GetValue(attrs, null))); 
     return sb.ToString(); 
    } 

Ainsi, au lieu d'écrire

BuildXPathQuery(attrs: new Dictionary<string,string> {{"attr","value"}}); 

Je pourrais écrire

BuildXPathQuery(attrs: new {attr=value}); 

Mais cela at-il des inconvénients?

Répondre

4

Il utilise une réflexion qui peut être plus lente qu'un accès de type normal. Un autre inconvénient est qu'en regardant la signature de la méthode, vous voyez un objet et pour un consommateur éventuel de cette méthode, il n'est pas toujours évident de savoir ce qu'il doit y mettre parce que l'objet peut littéralement être:

Quand Intellisense montre :

BuildXPathQuery(object attrs); 

vous avez vraiment deviner ici à moins qu'il est assez bien documenté (par exemple des aides ASP.NET MVC HTML utiliser approche similaire pour construire des attributs HTML sur des éléments DOM).

Il y a tellement approche Rubyist que je l'aime :-) (les arguments optionnels et tables de hachage)

0

Je pense que les types Annonymous sont cool et vous pouvez facilement le jeter à l'objet approprié en fonction de l'objet que vous envoyez.

Vous pouvez utiliser ce type d'annonce pour la méthode et l'utiliser également par réflexion. Vous pouvez également essayer de jeter l'objet dans le type si vous le souhaitez à l'aide:

var x = attrs as new{x="", y=""}; 

Vous devez noter, le compilateur est assez intelligent pour utiliser le type annonymous existant plutôt que de créer un nouveau type pour la coulée.

http://www.west-wind.com/weblog/posts/189329.aspx

Comme il a déjà parlé, les types annonymous sont plus lents, de sorte que le seul problème que je vois est la lenteur. Mais les regards d'annonce me paraissent cool.