2010-10-28 4 views
2

Dans .NET Framework, certaines classes utilisent la syntaxe SomethingCollection. Par exemple, lorsqu'il traite SqlCommand, il a un paramètre Parameters de type SqlParameterCollection. Comme il ne dispose pas d'une forme de IEnumerable<SqlParameter> (ou IList<SqlParameter> ou similaire), il est impossible d'écrire:Pourquoi SomethingCollection est utilisé à la place de Collection <Something>?

foreach (var c in sqlCommand.Parameters) 
{ 
    Debug.WriteLine(string.Concat(c.ParameterName, ": ", c.Value)); 
} 

Au lieu de cela, var doit être remplacé par un SqlParameter explicite.

La chose est très similaire lorsqu'ils traitent avec des contrôles Windows Forms (collections d'articles de ListView, etc.), et existe dans d'autres classes.

Quelle est cette chose? Pourquoi de telles classes existent-elles et sont-elles utilisées à la place des génériques IEnumerable s/IList s?

+1

Principalement parce que les médicaments génériques n'existait pas dans .NET –

Répondre

7

Beaucoup des collections exposées par les API .NET ont été conçus avant .NET 2.0, ainsi, avant les médicaments génériques étaient disponibles.

+0

de vanille il est donc juste quelque chose « très » vieux, et n'a pas été réécrit depuis la première version de .NET Framework? –

+0

Je voudrais enregistrer l'expression "très" ancienne pour quelque chose comme Cobol, mais oui, beaucoup de constructions qui suivent ce modèle étaient dans les cadres d'origine .NET 1.0 et 1.1. Réécrire ces composants serait un changement majeur, il est donc préférable de laisser reposer les chiens endormis. –

+0

@MainMa: Vous pensez que c'est une bonne idée d'aller réécrire des choses juste parce que vous pouvez quand il y a peu/pas d'avantage pour le client et que vous êtes en train de casser une grande partie de son code? –

0

Il est possible que certaines parties du framework .net ont été conçus par différentes équipes avec des objectifs différents à l'esprit. Certains praticiens de Domain Driven Design préconiseraient l'utilisation d'agrégations, qui sont des objets racine qui contrôlent tous les objets dans les collections, en tant que forme d'interruption pour certains problèmes résultant de l'exposition de collections.

Je devine les parties du cadre de .net qui utilisent cette conception avait une raison pour restreindre l'accès.

+0

Notez que l'utilisation de la syntaxe 'SomethingCollection' ne limite pas l'accès aux éléments, ni interdit de les modifier, ajouter ou supprimer. Cela rend impossible l'utilisation du mot clé 'var'. –

+0

J'ai alors mal compris le problème. Merci de me le faire savoir. – wllmsaccnt

Questions connexes