Maior diferença entre Foreach e Usando
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.
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
demandasIDisposable
;foreach
força gatilho deIEnumerable[<T>]
, mas na verdade é pato digitado (você não precisaIEnumerable
paraforeach
) -
using
tem uma construçãotry
/finally
previsível;foreach
força envolver umDispose()
se o iterador éIEnumerable<T>
Se alguma coisa, eu diria using
está mais perto de lock
do que foreach
.
Outras dicas
- Nope
- Não,
foreach
irá desfazer do seuIEnumerable
se implementaIDisposable
.
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);
}
}