1
resposta

Escopo de variável OUT

Fala galerinha, tudo bem? Espero que sim.

No exemplo da aula a variável out int *id* ou var **id e aplicada como parâmetro out dentro da condição IF, vimos que o seu escopo vai para fora dessa cláusula IF, ou seja, o escopo da variável foi para o laço WHILE. Fiz um teste tentando usar a variável fora do laço WHILE, mas o sistema quebrou. Veja,:

public override void Main()
        {
            using (var streamReader = File.OpenText("clientes.csv"))
            {
                string linha = string.Empty;
                while ((linha = streamReader.ReadLine()) != null)
                {                    
                    string[] campos = linha.Split(',');
                    //int id = 0;
                    //int.TryParse(campos[0], out int id);
                    if (int.TryParse(campos[0], out var id))
                    {
                        Cliente cliente = new Cliente(id, campos[1], campos[2], campos[3]);

                WriteLine("Dados do Cliente");
                WriteLine("================");
                WriteLine("ID: " + cliente.Id);
                WriteLine("Nome: " + cliente.Nome);
                WriteLine("Telefone: " + cliente.Telefone);
                WriteLine("Website: " + cliente.Website);
                WriteLine("================");
            }

            Console.WriteLine($"ID fora do IF: {id}");
        }
       ** Console.WriteLine($"ID fora do WHILE: {id}");**
    }
}

Minha dúvida é, o escopo de uma variável out usada como parâmetro, será sempre o escopo pai, ou seja, o escopo imediatamente superior o qual a condição ou método está inserido?

1 resposta

Olá. Tudo bem?

No exemplo que você mostrou, a variável "id" foi declarada como parâmetro "out" dentro do bloco "if". Isso significa que o escopo da variável "id" será o bloco "if" e qualquer bloco filho dele, como o bloco "while".

No entanto, quando você tentou usar a variável "id" fora do bloco "while", o sistema quebrou. Isso acontece porque a variável "id" só é válida dentro do escopo em que foi declarada, ou seja, dentro do bloco "if" e do bloco "while". Quando você tenta acessá-la fora desses blocos, ela não existe mais.

Para resolver esse problema, você pode declarar a variável "id" fora do bloco "if" e atribuir um valor padrão a ela antes do bloco "while". Assim, ela terá um escopo maior e poderá ser usada em qualquer lugar dentro do método.

Aqui está um exemplo de como você pode fazer isso:

public override void Main()
{
    using (var streamReader = File.OpenText("clientes.csv"))
    {
        string linha = string.Empty;
        int id = 0; // declaração da variável fora do bloco "if"
        while ((linha = streamReader.ReadLine()) != null)
        {                    
            string[] campos = linha.Split(',');

            if (int.TryParse(campos[0], out id)) // atribuição do valor à variável "id"
            {
                Cliente cliente = new Cliente(id, campos[1], campos[2], campos[3]);

                WriteLine("Dados do Cliente");
                WriteLine("================");
                WriteLine("ID: " + cliente.Id);
                WriteLine("Nome: " + cliente.Nome);
                WriteLine("Telefone: " + cliente.Telefone);
                WriteLine("Website: " + cliente.Website);
                WriteLine("================");
            }

            Console.WriteLine($"ID fora do IF: {id}");
        }

        Console.WriteLine($"ID fora do WHILE: {id}");
    }
}

Dessa forma, a variável "id" terá escopo no bloco "while" e também fora dele, permitindo que você a utilize em qualquer lugar dentro do método.

Espero ter ajudado e bons estudos!