2009-10-22 7 views
2

Cela pourrait même être une question simple, même un écolier peut répondre. Quelles sont les similitudes et les différences entre "ForEach" et "Using" (demandé dans une interview).Différence majeure entre Foreach et l'utilisation

Mon hypothèse était

1) Les deux sont dénombrable

2) L'utilisation peut gérer les ressources de mémoire, mais foreach can't.using prend en charge IDisposable, foreach ne peut pas.

Je souhaite connaître les réponses.

+6

la meilleure question est ... quelles sont les similitudes o.O ??? –

+1

Cela ressemble presque à une question piège. Ils font des choses très différentes. – devuxer

+0

Une question que je préfère poser: "Quelle est la différence entre IEnumerable et IEnumerator?" – devuxer

Répondre

3

Similitudes:

  • ils sont tous deux des extensions de codes logiques, fournir le code-plaque de la chaudière de scénarios autrement complexes
  • tous deux impliquent une variable cachée BLE introduit par le compilateur: pour le iterator et l'instantané de l'objet jetable, respectivement

Mais c'est sur le point où elle se termine ...

  • usingexigeIDisposable; foreachpourrait de déclenchement IEnumerable[<T>], mais est en fait le canard tapé (vous n'avez pas besoin IEnumerable pour foreach)
  • using a un try/finally prévisible construction; foreachpourrait impliquer unDispose() si l'itérateur est IEnumerable<T>

Si quoi que ce soit, je dirais using est plus proche de lock que de foreach.

8
  1. Non Nope, foreach disposera de votre IEnumerable si elle met en œuvre IDisposable.
+0

+1 pour souligner la similitude là-bas, avec l'élimination de l'énumérable. –

+3

en fait, IEnumerator implémente IDisposable – Bryan

+0

@bryan: Mais IEnumerator ne le fait pas! ha :) – leppie

4

using définit une portée, à l'extérieur de laquelle un objet ou des objets seront disposés. Il ne boucle pas ou ne itère pas.

4

Ils servent tous deux des objectifs très différents.

foreach est faite pour énumérer des éléments dans une collection/tableau. using est une construction pratique pour s'assurer que vous disposez correctement de la chose que vous utilisez. Même lorsque des exceptions sont levées par exemple.

Les similitudes pour ces deux constructions sont justes, étranges. Quelqu'un peut-il penser à des similitudes (en dehors de la très évidente: «ils sont les deux mots clés en C# ')?

+6

Ils utilisent tous les deux des parenthèses! – Philippe

+0

@Philippe: +1 pour me faire sourire: D – pyrocumulus

+4

Il existe une similarité entre 'foreach' et' using': Les énumérateurs implémentent 'IDisposable' et un' foreach' encapsule implicitement l'utilisation d'un énumérateur dans un bloc 'using' . Une autre façon de dire ceci est que c'est qu'un foreach peut être recodé comme un bloc using et que l'IL qui en résulte sera identique. – jason

3

La principale différence entre foreach et using est que foreach est utilisé pour dénombrer sur une IEnumerable alors qu'un using est utilisé pour définir un périmètre extérieur de laquelle un objet est disposé.

Il y a une similitude entre foreach et using: mettre en œuvre énumérateurs IDisposable et foreach seront implicitement envelopper l'utilisation d'un recenseur dans un bloc using. Une autre façon de dire ceci est que foreach peut être recodé comme un bloc utilisant et l'IL qui en résulte sera identique.

Le bloc de code

var list = new List<int>() {1, 2, 3, 4, 5}; 
foreach(var i in list) { 
    Console.WriteLine(i); 
} 

est effectivement le même que

var list = new List<int>() {1, 2, 3, 4, 5}; 
using (var enumerator = list.GetEnumerator()) { 
    while (enumerator.MoveNext()) { 
     Console.WriteLine(enumerator.Current); 
    } 
} 
+0

Excellent où est-ce que vous vous asseyez et pensez ce genre de choses techniques? Seuls certains geniuos nés peuvent le penser. – Kalai

+0

Je me demande pourquoi un seul vote est accordé. – Kalai

+0

Notez que ceci n'est pas strictement vrai; foreach ne demande pas IDisposable sur l'itérateur. Signification: seul le générique 'IEnumerator ' le fait; le non-générique ne le fait pas (nécessairement). –

Questions connexes