2009-12-18 8 views
1

Ma question est la suivante: Quelle est la solution la plus efficace et la plus correcte pour un grand nombre de données?Déclaration des collections en C#

_pointBuffer1 = new Point3DCollection { 
      new Point3D(140.961, 142.064, 109.300), new Point3D(142.728, 255.678, (...) 

- ou -

_pointBuffer1.Add(new Point3D(140.961, 142.064, 109.300)); _poitBuffer1.Add(142.728, (...) 

Ou est-ce la même chose?

Point3D est déclarée comme Point3DCollection, mais ma question est pour une collection d'objets (peut-être Int32 par exemple) ..

+0

Vous devriez vous efforcer d'écrire du code complet, à moins que votre question ne concerne des problèmes de syntaxe. Dans ce cas, vous avez "poit", un appel Ajouter avec seulement les valeurs, les appels d'ajout imbriqués (le second exemple ne ferme pas l'appel). Mais le plus important, vous manquez la construction de la collection, à savoir. "_pointBuffer1 = new Point3DCollection();" donc non, même si nous ne tenons pas compte des problèmes de syntaxe, ils ne sont pas les mêmes. –

+0

J'ai une classe Models qui construit ce point3DCollection en premier. Le code que j'ai présent est sur une méthode InitMesh. – jose

Répondre

4

Les deux sont écrites à la même IL. Les initialiseurs de collection ne sont que du sucre syntaxique. Ils appelleront la méthode Add. Exemple:

var res = new List<int>() { 1, 2, 3 }; 

est compilé à:

List<int> <>g__initLocal0 = new List<int>(); 
<>g__initLocal0.Add(1); 
<>g__initLocal0.Add(2); 
<>g__initLocal0.Add(3); 
List<int> res = <>g__initLocal0; 

La seule différence est une variable locale supplémentaire étant déclarée.

+0

Hm .. Je vois .. et ce qui est le plus correct dans la conception de code et de la documentation? – jose

+0

Les deux sont corrects. C'est à vous de décider ce qui rend votre code plus lisible. –

+0

Vous pouvez choisir ce que vos directives de codage personnelles disent. La seule chose que je ferais, est d'écrire chaque 'new Point3D()' ou 'buffer.Add()' sur une nouvelle ligne, de sorte que vous ayez une liste complète dans le code. – Oliver

7

Je suggère fortement d'utiliser l'initialiseur de collection par souci de clarté (bien que j'utiliserais aussi des nouvelles lignes).

Ils ne sont pas tout à fait finissent comme le même IL, vous l'esprit. Le premier finit par être équivalent à:

var tmp = new Point3DCollection(); 
tmp.Add(new Point3D(140.961, 142.064, 109.300)); 
tmp.Add(new Point3D(142.728, 255.678)); 
... 
_pointBuffer1 = tmp; 

En d'autres termes, l'affectation à la variable éventuelle ne se fait après tous les appels Add.

Ceci est important si votre constructeur Point3D fait référence en quelque sorte à _pointBuffer1!

+1

+1 - Quiconque fait une recommandation * pour plus de clarté * mérite un upvote. – Konamiman

1

L'initialisation de la collection est un sucre syntaxique. J'entends par là que c'est un raccourci pratique qui est compris par le complicateur. Le compilateur produira un code qui est logiquement identique à l'appel de la méthode add de la collection pour chaque élément.

+0

donc c'est juste une question de conception de code et de lisibilité? – jose

+0

Je dirais qu'il est plus clair d'utiliser l'initialisation de collection car votre intention est évidente (c.-à-d.vous initialisez la collection). –