Questão nº 30
Questão de Tecnologias da Informação · FCC SEFAZ-SC 2018 - Conhecimentos Específicos (P3) (nº 30)
Um Auditor está trabalhando junto com uma equipe de desenvolvimento de uma aplicação em C#, que necessita de uma estrutura capaz de armazenar diversos objetos de um tipo de classe específico, de tal forma que seja facilitada a adição, consulta e remoção de elementos. Para tal, a equipe optou pelo uso da lista abaixo.
```
List<Pessoa> lista = new List<Pessoa>();
Pessoa p1 = new PessoaJuridica();
Pessoa p2 = new PessoaFisica();
Pessoa p3 = new PessoaJuridica();
lista.Add(p1);
lista.Add(p2);
lista.Add(p3);
```
Para percorrer os elementos desta lista obtendo cada objeto do tipo `Pessoa`, utiliza-se o comando
- A`foreach (Pessoa p in lista) { }` (alternativa correta)
- B
for(int indice=0; indice<=lista.Length(); indice++){lista.Get(Pessoa p);} - C`while(Pessoa p from lista) { }`
- D
for(int i=1; i<=lista.Length(); i++) {List.GetAt(Pessoa p);} - E`foreach(Get Pessoa in lista) { }`
Resposta comentada
Gabarito Alternativa A
O `foreach` é um comando especial em C# que permite percorrer todos os itens de uma coleção (como uma lista) de forma simples e segura, sem precisar se preocupar com índices ou o tamanho da coleção. Ele pega um item por vez e o disponibiliza para você usar dentro do bloco de código.
(A) Correta: O comando `foreach (Pessoa p in lista) { }` é a forma padrão e mais idiomática em C# para iterar sobre todos os elementos de uma coleção `lista` (que implementa `IEnumerable`), atribuindo cada elemento do tipo `Pessoa` à variável `p` em cada iteração.
(B) Incorreta: Esta alternativa contém múltiplos erros de sintaxe e lógica. `lista.Length()` não existe para `List<T>` (o correto seria `lista.Count`); o operador `<=` com `Count` causaria um erro de índice fora dos limites (`IndexOutOfRangeException`) no último elemento; e `lista.Get(Pessoa p)` não é uma forma válida de acessar elementos (o acesso por índice seria `lista[indice]`). Armadilha: Esta é a alternativa mais tentadora para quem está acostumado com loops `for` de estilo C/Java e tenta adaptar a sintaxe sem conhecer as particularidades de C# para `List<T>`, como `Count` em vez de `Length()` e o acesso via `[]` em vez de um método `Get()`.
(C) Incorreta: `while(Pessoa p from lista) { }` não é uma sintaxe válida em C# para iteração de coleções. Mistura palavras-chave de `while` e `foreach` de forma incorreta.
(D) Incorreta: Contém erros semelhantes à alternativa B. `lista.Length()` está incorreto (deveria ser `lista.Count`); iniciar o índice em `1` e usar `<=` com `Count` pode pular o primeiro elemento e/ou causar erro de índice fora dos limites; e `List.GetAt(Pessoa p)` não é um método válido para acessar elementos.
(E) Incorreta: `foreach(Get Pessoa in lista) { }` não é uma sintaxe válida em C#. A palavra-chave `Get` não é usada dessa forma na declaração do `foreach`.
Fonte: FCC SEFAZ-SC 2018 - Conhecimentos Específicos (P3) Tecnologia da Informação (Caderno Tipo 1). Reproduzida para fins de estudo.