A versão 6.0 possui um novo recurso nameof
, mas não consigo entender o objetivo, pois apenas pega o nome da variável e altera para uma string na compilação.
Eu pensei que poderia ter algum objetivo ao usar, <T>
mas quando eu tento nameof(T)
apenas me imprime um em T
vez do tipo usado.
Alguma idéia do propósito?
T
antes. Havia uma maneira de obter o tipo usado antes.nameof
. Também ajuda a evitar erros de digitação.Respostas:
E os casos em que você deseja reutilizar o nome de uma propriedade, por exemplo, ao lançar uma exceção com base no nome de uma propriedade ou ao manipular um
PropertyChanged
evento. Existem inúmeros casos em que você gostaria de ter o nome da propriedade.Veja este exemplo:
No primeiro caso, renomear
SomeProperty
também mudará o nome da propriedade ou interromperá a compilação. O último caso não.Essa é uma maneira muito útil de manter seu código compilado e sem erros (mais ou menos).
(Um artigo muito bom de Eric Lippert, por
infoof
que não conseguiu, enquanto onameof
fez)fonte
nameof
e o nome da ação em vez de uma sequência codificada.public class MyController { public ActionResult Index() { return View(nameof(Index)); } }
- e você pode usarnameof
em membros não estáticos (por exemplo, você pode chamarnameof(MyController.Index)
usando a classe acima e ela emitirá "Índice"). Confira os exemplos em msdn.microsoft.com/en-us/library/…É realmente útil para
ArgumentException
e seus derivados:Agora, se alguém refatorar o nome do
input
parâmetro, a exceção também será mantida atualizada.Também é útil em alguns lugares onde anteriormente era necessário usar a reflexão para obter os nomes de propriedades ou parâmetros.
No seu exemplo,
nameof(T)
obtém o nome do parâmetro type - isso também pode ser útil:Outro uso de
nameof
é para enumerações - geralmente se você quiser o nome da string de uma enumeração, use.ToString()
:Na verdade, isso é relativamente lento, já que o .Net mantém o valor da enumeração (ie
7
) e encontra o nome no tempo de execução.Em vez disso, use
nameof
:Agora .Net substitui o nome da enumeração por uma sequência em tempo de compilação.
Ainda outro uso é para coisas como
INotifyPropertyChanged
e registro - nos dois casos, você deseja que o nome do membro que você está chamando seja passado para outro método:Ou...
fonte
typeof(T)
, que é outro pedaço de açúcar em tempo de compilação que é útil em circunstâncias semelhantes :-)nameofthismethod
. Você pode usar,Log.Error($"Error in {nameof(DoSomething)}...")
mas se copiar e colar isso para outros métodos, não perceberá que ainda está se referindoDoSomething
. Portanto, enquanto trabalha perfeitamente com variáveis ou parâmetros locais, o nome do método é um problema.nameOf
usará o[DisplayName]
atributo se presente? Para oenum
exemplo, eu uso[DisplayName]
muitas vezes com projetos MVCthrow new
é um outro antipadrão - acho que o uso excessivocatch
é um problema comum com desenvolvedores juniores porque parece consertar o problema (quando na maioria das vezes o oculta).Outro caso de uso em que o
nameof
recurso do C # 6.0 se torna útil - considere uma biblioteca como o Dapper que facilita muito as recuperações de banco de dados. Embora essa seja uma ótima biblioteca, você precisa codificar os nomes de propriedades / campos na consulta. O que isso significa é que, se você decidir renomear sua propriedade / campo, há grandes chances de você esquecer de atualizar a consulta para usar novos nomes de campo. Com a interpolação denameof
caracteres e os recursos, o código se torna muito mais fácil de manter e tipificar.Do exemplo dado no link
sem nome
com nome
fonte
Sua pergunta já expressa o objetivo. Você deve ver que isso pode ser útil para registrar ou lançar exceções.
por exemplo.
isso é bom, se eu alterar o nome da variável, o código será interrompido ou retornará uma exceção com uma mensagem incorreta .
Obviamente, os usos não se limitam a essa situação simples. Você pode usar
nameof
sempre que for útil codificar o nome de uma variável ou propriedade.Os usos são múltiplos quando você considera várias situações de ligação e reflexão. É uma excelente maneira de trazer os erros de tempo de execução para compilar o tempo.
fonte
OnPropertyChanged
métodos personalizados (que aceitam diretamente nomes de propriedades em vez dePropertyChangedEventArgs
) ou chama a reflexão para procurar por um determinado membro ou tipo?O caso de uso mais comum em que consigo pensar é ao trabalhar com a
INotifyPropertyChanged
interface. (Basicamente, tudo relacionado ao WPF e ligações usa essa interface)Veja este exemplo:
Como você pode ver da maneira antiga, temos que passar uma string para indicar qual propriedade foi alterada. Com
nameof
podemos usar o nome da propriedade diretamente. Isso pode não parecer grande coisa. Mas imagine o que acontece quando alguém muda o nome da propriedadeFoo
. Ao usar uma string, a ligação deixará de funcionar, mas o compilador não avisará. Ao usar nameof, você obtém um erro do compilador de que não há propriedade / argumento com o nomeFoo
.Observe que algumas estruturas usam alguma mágica de reflexão para obter o nome da propriedade, mas agora temos o nome disso, que não é mais necessário .
fonte
[CallerMemberName]
atributo no parâmetro de um novo método para gerar esse evento.[CallerMemberName]string x = null
é melhor quenameof(Property)
. Você poderia dizer que o nome da propriedade é usado duas vezes, mas esse é basicamente o argumento passado para uma função. Não é realmente o que se entende com DRY, eu acho :).nameof
é que o configurador de propriedades não precisa especificar o nome da propriedade, eliminando a possibilidade de copiar / colar erros.INotifyPropertyChanged
usar a opção[CallerMemberNameAttribute]
permite que a notificação de alteração seja levantada de maneira limpa a partir de um configurador de propriedades, enquanto anameof
sintaxe permite que a notificação de alteração seja levantada de maneira limpa a partir de um local diferente no seu código.O uso mais comum será na validação de entrada, como
No primeiro caso, se você refatorar o método que altera o nome do parâmetro par , provavelmente esquecerá de alterá-lo na ArgumentNullException . Com o nome de você não precisa se preocupar com isso.
Consulte também: nameof (C # e referência do Visual Basic)
fonte
O projeto ASP.NET Core MVC usa
nameof
noAccountController.cs
eManageController.cs
com oRedirectToAction
método para referenciar uma ação no controlador.Exemplo:
Isso se traduz em:
e leva o usuário para a ação 'Index' no controlador 'Home', ou seja
/Home/Index
.fonte
return RedirectToAction(nameof(HomeController.Index), nameof(HomeController).Substring(nameof(HomeController),0,nameof(HomeController).Length-"Controller".Length));
?Como outros já apontaram, o
nameof
operador insere o nome que o elemento recebeu no código-fonte.Gostaria de acrescentar que essa é uma idéia muito boa em termos de refatoração, pois torna a refatoração de string segura. Anteriormente, usei um método estático que utilizava a reflexão para o mesmo objetivo, mas que afeta o desempenho em tempo de execução. O
nameof
operador não tem impacto no desempenho do tempo de execução; ele faz seu trabalho em tempo de compilação. Se você der uma olhada noMSIL
código, encontrará a string incorporada. Veja o seguinte método e seu código desmontado.No entanto, isso pode ser uma desvantagem se você planeja ofuscar seu software. Após a ofuscação, a cadeia incorporada pode não corresponder mais ao nome do elemento. Mecanismos que dependem desse texto serão interrompidos. Exemplos para isso, incluindo, entre outros: Reflection, NotifyPropertyChanged ...
Determinar o nome durante o tempo de execução custa algum desempenho, mas é seguro para ofuscação. Se a ofuscação não for necessária nem planejada, eu recomendaria o uso do
nameof
operador.fonte
Considere que você usa uma variável em seu código e precisa obter o nome da variável e, digamos, imprimi-la, você deve usar
E se alguém refatorar o código e usar outro nome para "myVar", ele / ela terá que observar o valor da string no seu código e usá-lo de acordo.
Em vez disso, se você tivesse
Ajudaria a refatorar automaticamente!
fonte
Type
o valor. Isso tornaria possível o código que invocava métodos de log para eliminar muita redundância.O artigo do MSDN lista o roteamento MVC (o exemplo que realmente clicou no conceito para mim) entre vários outros. O parágrafo da descrição (formatado) diz:
As respostas aceitas / com melhor classificação já oferecem vários exemplos concretos excelentes.
fonte
O objetivo do
nameof
operador é fornecer o nome da fonte dos artefatos.Geralmente, o nome da fonte é o mesmo que o nome dos metadados:
Mas isso nem sempre pode ser o caso:
Ou:
Um uso que tenho dado a ele é para nomear recursos:
O fato é que, nesse caso, eu nem precisava das propriedades geradas para acessar os recursos, mas agora tenho um tempo de compilação para verificar se os recursos existem.
fonte
Um dos usos da
nameof
palavra-chave é para definir programaticamente oBinding
wpf .para definir,
Binding
você precisa definirPath
com string e com anameof
palavra - chave, é possível usar a opção Refatorar.Por exemplo, se você possui
IsEnable
uma propriedade de dependência no seuUserControl
e deseja vinculá-lo aIsEnable
algumCheckBox
no seuUserControl
, pode usar estes dois códigos:e
É óbvio que o primeiro código não pode refatorar, mas o segundo ...
fonte
Anteriormente, estávamos usando algo assim:
Razão - compile a segurança do tempo. Ninguém pode renomear silenciosamente propriedades e quebrar a lógica do código. Agora podemos usar nameof ().
fonte
Tem vantagem quando você usa o ASP.Net MVC. Quando você usa o auxiliar HTML para criar algum controle na exibição, ele usa nomes de propriedades no atributo attribure da entrada html:
Faz algo assim:
Portanto, agora, se você precisar validar sua propriedade no método Validar, faça isso:
Caso você renomeie sua propriedade usando ferramentas de refatoração, sua validação não será interrompida.
fonte
Outro caso de uso de
nameof
é verificar as guias, em vez de verificar o índice, você pode verificar aName
propriedade das guias, como segue:Menos bagunçado :)
fonte
Acho que
nameof
aumenta a legibilidade de instruções SQL muito longas e complexas em meus aplicativos. Faz com que as variáveis se destacem nesse mar de strings e elimina seu trabalho de descobrir onde as variáveis são usadas em suas instruções SQL.fonte