TransWikia.com

Como pegar o nome de uma variável dentro de um método?

Stack Overflow em Português Asked by Pedro Martins on December 11, 2021

Eu preciso acessar o nome de uma variável dentro de um método.

Exemplo:

public class A
{
   public A()
   {
     string nameToWrite = "thisdoesntmatter";
     B.GetName(nameToWrite);
   }
}

public class B
{
   public static GetName(string nameIrrelevant)
   {
      Console.WriteLine(nameof(nameIrrelevant));
   }
}

Mas o retorno é esse:

nameIrrelevant

E queria que fosse:

nameToWrite

One Answer

Você está falando de variáveis locais e estas são apenas apelidos para endereços de memória totalmente desnecessários para execução, é apenas uma abstração para facilitar o entendimento do programador.

Após a compilação não há nome de variável (local, em linguagens/implementações que sejam 100% nativas e estáticas, até mesmo símbolos não locais podem ser descartados), portanto não tem o que ser acessado. Se o exercício pede exatamente isto, e acho que não pede, que é interpretação errada, o exercício é falho e não faz sentido. Se não é um exercício, tem algo muito errado.

O que pode fazer é colocar um parâmetro no método e passar o nome como string como argumento para o método. Mesmo isto não faz sentido.

Lembrando que você sempre sabe o nome de variáveis locais durante o desenvolvimento, então não faz sentido criar um código para descobrir qual é o nome.

Mesmo o nameof() só existe como medida protetiva para evitar que o código dessincronize com o texto usado, assim se mudar o nome da variável, a compilação do nameof() falhará e você poderá mudar manualmente concordando que agora o outro nome é o correto. Quando usa a string direto com o nome da variável, se tinha um "x", e a variável muda para y, o código fica com "x" e pode não ser notado. Na prática este operador faz nada real na aplicação.

Não faz sentido saber o nome da variável que foi usada para chamada do método, tem zero benefícios nisso. Nem deveria ter algum. As únicas linguagens onde faz sentido são as que possuem escopo dinâmico, que é uma das ideias mais idiotas já criadas na computação, e posso falar bem disso porque trabalhei com linguagem assim, mas que por sorte hoje é opcional, e mesmo quando era obrigatório fazer assim era melhor fazer de conta que nem podia se aproveitar disto.

Então não precisa acessar este nome. E se precisasse mesmo, deveria justificar. Quem sabe é um problema XY (vide ao lado se estiver lendo isso durante a Copa :D ). Este método getName() é simplesmente desnecessário e um erro de programação. Assim pode ter alguma relevância, ainda esquisito:

public class A {
    public A() {
        var nameToWrite = "thisdoesntmatter";
        B.WriteName(nameof(nameToWrite));
    }
}

public class B {
    public static WriteName(string name) => WriteLine(name));
}

Coloquei no GitHub para referência futura.

Note que mudei até o nome do método pra fazer sentido, e ele só deveria existir como abstração.

Isto é a mesma coisa:

public A() {
    var nameToWrite = "thisdoesntmatter";
    WriteLine("nameToWrite"); //o nameof() daria mais proteção contra alteração desavisada
}

Answered by Maniero on December 11, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP