Pergunta

Isso poderia até ser uma questão simples, mesmo um menino de escola pode responder.

O que é as semelhanças e diferenças entre "ForEach" e "Uso" (perguntado em uma entrevista).

Minha suposição era

1) Ambos são enumeráveis ??

2) Usando pode lidar com recursos de memória, mas foreach suportes can't.using IDisposable, foreach não pode.

Gostaria de saber as respostas.

Foi útil?

Solução

Semelhanças:

  • ambos são expansões de códigos lógicos, proporcionando código caldeira-plate de cenários de outra forma complexos
  • ambos envolvem uma variável escondida introduzido pelo compilador: para o iterador eo instantâneo do objeto descartável, respectivamente

Mas isso é sobre onde termina ...

  • using demandas IDisposable; foreach força gatilho de IEnumerable[<T>], mas na verdade é pato digitado (você não precisa IEnumerable para foreach)
  • using tem uma construção try / finally previsível; foreach força envolver um Dispose() se o iterador é IEnumerable<T>

Se alguma coisa, eu diria using está mais perto de lock do que foreach.

Outras dicas

  1. Nope
  2. Não, foreach irá desfazer do seu IEnumerable se implementa IDisposable.

using define um âmbito de aplicação, do lado de fora da qual um objecto ou objectos serão eliminados. Ele não loop ou iterate.

Ambos servem a propósitos muito diferentes.

foreach é feita para enumerar itens em uma coleção / matriz. using é uma construção útil para certificar-se de que você descarte a coisa que o seu uso. Mesmo quando exceções são lançadas, por exemplo.

Semelhanças para estas duas construções são apenas, estranho. Alguém pode pensar em quaisquer semelhanças (para além do óbvio: 'ambos são palavras-chave em C #')?

A principal diferença entre foreach e using é que foreach é usado para enumerar sobre uma IEnumerable enquanto que um using é utilizado para definir uma fora do âmbito das quais um objecto vai ser disposta.

Há uma semelhança entre foreach e using: Enumerators implementar IDisposable e uma foreach vai embrulhar implicitamente o uso de um enumerador em um bloco using. Outra maneira de dizer isso é que é que uma foreach podem ser recodificados como um bloco usando eo IL resultante será idêntica.

O bloco de código

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

é efetivamente o mesmo que

var list = new List<int>() {1, 2, 3, 4, 5};
using (var enumerator = list.GetEnumerator()) {
    while (enumerator.MoveNext()) {
        Console.WriteLine(enumerator.Current);
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top