La versión 6.0 tiene una nueva característica de nameof
, pero no puedo entender el propósito, ya que solo toma el nombre de la variable y lo cambia a una cadena en la compilación.
Pensé que podría tener algún propósito cuando lo uso, <T>
pero cuando lo intento nameof(T)
simplemente me imprime un tipo en T
lugar del tipo utilizado.
¿Alguna idea sobre el propósito?
T
antes. Había una manera de obtener el tipo usado antes.nameof
. También ayuda a prevenir errores tipográficos.[Test, TestCaseSource(typeof(MyDataClass), "TestCases")]
, que se puede reemplazar por[Test, TestCaseSource(typeof(MyDataClass), nameof(MyDataClass.TestCases))]
. Mucho más bonito.Respuestas:
¿Qué sucede con los casos en los que desea reutilizar el nombre de una propiedad, por ejemplo, cuando lanza una excepción basada en el nombre de una propiedad o maneja un
PropertyChanged
evento? Existen numerosos casos en los que desea tener el nombre de la propiedad.Toma este ejemplo:
En el primer caso, el cambio de nombre
SomeProperty
también cambiará el nombre de la propiedad o interrumpirá la compilación. El último caso no.Esta es una forma muy útil de mantener su código compilado y libre de errores (más o menos).
(Un muy buen artículo de Eric Lippert por qué
infoof
no lo hizo, mientras lonameof
hizo)fuente
nameof
y el nombre de la acción en lugar de una cadena codificada.public class MyController { public ActionResult Index() { return View(nameof(Index)); } }
, y puede usarlonameof
en miembros no estáticos (por ejemplo, puede llamarnameof(MyController.Index)
usando la clase anterior y emitirá "Índice"). Vea los ejemplos en msdn.microsoft.com/en-us/library/…Es realmente útil para
ArgumentException
y sus derivados:Ahora, si alguien refactoriza el nombre del
input
parámetro, la excepción también se mantendrá actualizada.También es útil en algunos lugares donde previamente se tuvo que usar la reflexión para obtener los nombres de propiedades o parámetros.
En su ejemplo,
nameof(T)
obtiene el nombre del parámetro de tipo; esto también puede ser útil:Otro uso de
nameof
es para enumeraciones, generalmente si desea el nombre de cadena de una enumeración que utiliza.ToString()
:En realidad, esto es relativamente lento ya que .Net mantiene el valor de enumeración (es decir
7
) y encuentra el nombre en tiempo de ejecución.En su lugar use
nameof
:Ahora .Net reemplaza el nombre de enumeración con una cadena en tiempo de compilación.
Sin embargo, otro uso es para cosas como el
INotifyPropertyChanged
registro: en ambos casos, desea que el nombre del miembro que está llamando se pase a otro método:O...
fuente
typeof(T)
, que es otra pieza de azúcar en tiempo de compilación que es útil en circunstancias similares :-)nameofthismethod
. Puede usarlo,Log.Error($"Error in {nameof(DoSomething)}...")
pero si copia y pega esto a otros métodos, no notará que todavía se está refiriendoDoSomething
. Entonces, si bien funciona perfectamente con variables o parámetros locales, el nombre del método es un problema.nameOf
usará el[DisplayName]
atributo si está presente? Para elenum
ejemplo que uso a[DisplayName]
menudo con proyectos MVCthrow new
es un antipatrón completamente diferente: encuentro que el uso excesivocatch
es un problema común con los desarrolladores junior porque se siente como solucionar el problema (cuando la mayoría de las veces lo está ocultando).Otro caso de uso en el que la
nameof
función de C # 6.0 se vuelve útil : considere una biblioteca como Dapper que hace que las recuperaciones de DB sean mucho más fáciles. Aunque esta es una gran biblioteca, necesita codificar los nombres de propiedad / campo dentro de la consulta. Lo que esto significa es que si decide cambiar el nombre de su propiedad / campo, hay muchas posibilidades de que se olvide de actualizar la consulta para usar nuevos nombres de campo. Con la interpolación de cadenas y lasnameof
características, el código se vuelve mucho más fácil de mantener y seguro.Del ejemplo dado en el enlace
sin nombre de
con nombre de
fuente
Su pregunta ya expresa el propósito. Debe ver que esto puede ser útil para iniciar sesión o lanzar excepciones.
por ejemplo.
Esto es bueno, si cambio el nombre de la variable, el código se romperá o devolverá una excepción con un mensaje incorrecto .
Por supuesto, los usos no se limitan a esta simple situación. Puede usarlo
nameof
siempre que sea útil codificar el nombre de una variable o propiedad.Los usos son múltiples cuando considera varias situaciones vinculantes y de reflexión. Es una excelente manera de llevar los errores de tiempo de ejecución al tiempo de compilación.
fuente
OnPropertyChanged
métodos personalizados (que aceptan directamente nombres de propiedades en lugar dePropertyChangedEventArgs
) o llamadas a la reflexión para buscar un determinado miembro o tipo?El caso de uso más común que se me ocurre es cuando trabajo con la
INotifyPropertyChanged
interfaz. (Básicamente, todo lo relacionado con WPF y enlaces utiliza esta interfaz)Echale un vistazo a éste ejemplo:
Como puede ver en la forma anterior, tenemos que pasar una cadena para indicar qué propiedad ha cambiado. Con
nameof
podemos usar el nombre de la propiedad directamente. Esto podría no parecer un gran problema. Pero imagina lo que sucede cuando alguien cambia el nombre de la propiedadFoo
. Cuando use una cadena, el enlace dejará de funcionar, pero el compilador no le avisará. Cuando usa nameof, obtiene un error del compilador de que no hay propiedad / argumento con el nombreFoo
.Tenga en cuenta que algunos marcos usan algo de magia de reflexión para obtener el nombre de la propiedad, pero ahora tenemos el nombre de esto ya no es necesario .
fuente
[CallerMemberName]
atributo en el parámetro de un nuevo método para generar este evento.[CallerMemberName]string x = null
es mejor quenameof(Property)
. Se podría decir que el nombre de la propiedad se usa dos veces, pero ese es básicamente el argumento pasado a una función. No es realmente lo que significa DRY, creo :).nameof
es que el configurador de propiedades no necesita especificar el nombre de la propiedad, eliminando la posibilidad de copiar / pegar errores.INotifyPropertyChanged
, ya que[CallerMemberNameAttribute]
permite que la notificación de cambio se genere limpiamente desde un configurador de propiedades, mientras que lanameof
sintaxis permite que una notificación de cambio se genere limpiamente desde una ubicación diferente en su código.El uso más común será en la validación de entrada, como
En el primer caso, si refactoriza el método que cambia el nombre del parámetro par , probablemente se olvide de cambiar eso en ArgumentNullException . Con nameof no tienes que preocuparte por eso.
Vea también: nameof (C # y Referencia de Visual Basic)
fuente
El proyecto ASP.NET Core MVC se usa
nameof
enAccountController.cs
yManageController.cs
con elRedirectToAction
método para hacer referencia a una acción en el controlador.Ejemplo:
Esto se traduce en:
y lleva al usuario a la acción 'Índice' en el controlador 'Inicio', es decir
/Home/Index
.fuente
return RedirectToAction(nameof(HomeController.Index), nameof(HomeController).Substring(nameof(HomeController),0,nameof(HomeController).Length-"Controller".Length));
?Como otros ya han señalado, el
nameof
operador inserta el nombre que se le dio al elemento en el código fuente.Me gustaría agregar que esta es una muy buena idea en términos de refactorización, ya que hace que esta refactorización de cadenas sea segura. Anteriormente, utilicé un método estático que utilizaba la reflexión para el mismo propósito, pero que tiene un impacto en el rendimiento del tiempo de ejecución. El
nameof
operador no tiene impacto en el rendimiento del tiempo de ejecución; hace su trabajo en tiempo de compilación. Si observa elMSIL
código, encontrará la cadena incrustada. Consulte el siguiente método y su código desmontado.Sin embargo, eso puede ser un inconveniente si planea ofuscar su software. Después de la ofuscación, la cadena incrustada ya no puede coincidir con el nombre del elemento. Los mecanismos que dependen de este texto se romperán. Ejemplos de eso, incluidos, entre otros, son: Reflection, NotifyPropertyChanged ...
Determinar el nombre durante el tiempo de ejecución cuesta algo de rendimiento, pero es seguro para la ofuscación. Si la ofuscación no es necesaria ni planificada, recomendaría usar el
nameof
operador.fuente
Tenga en cuenta que usa una variable en su código y necesita obtener el nombre de la variable y digamos imprimirla, debe usar
Y si alguien refactoriza el código y usa otro nombre para "myVar", él / ella tendría que estar atento al valor de la cadena en su código y cambiarlo en consecuencia.
En cambio si tuvieras
¡Sería útil refactorizar automáticamente!
fuente
Type
y el valor. Eso haría posible que los métodos de registro de invocación de código eliminen mucha redundancia.El artículo de MSDN enumera el enrutamiento MVC (el ejemplo que realmente hizo clic en el concepto para mí) entre varios otros. El párrafo de descripción (formateado) dice:
Las respuestas aceptadas / mejor valoradas ya ofrecen varios ejemplos concretos excelentes.
fuente
El propósito del
nameof
operador es proporcionar el nombre de origen de los artefactos.Por lo general, el nombre de origen es el mismo nombre que el nombre de metadatos:
Pero esto puede no ser siempre el caso:
O:
Un uso que le he estado dando es para nombrar recursos:
El hecho es que, en este caso, ni siquiera necesitaba las propiedades generadas para acceder a los recursos, pero ahora tengo un tiempo de compilación para verificar que los recursos existan.
fuente
Uno de los usos de la
nameof
palabra clave es para configurarBinding
wpf mediante programación .para configurar
Binding
debe configurarPath
con una cadena, y con unanameof
palabra clave, es posible usar la opción Refactorizar.Por ejemplo, si tiene una
IsEnable
propiedad de dependencia en suUserControl
y desea vincularla aIsEnable
algunaCheckBox
en suUserControl
, puede usar estos dos códigos:y
Es obvio que el primer código no puede refactorizar, pero el primero ...
fuente
Anteriormente estábamos usando algo así:
Motivo: seguridad en el tiempo de compilación. Nadie puede renombrar silenciosamente la propiedad y romper la lógica del código. Ahora podemos usar nameof ().
fuente
Tiene ventaja cuando usa ASP.Net MVC. Cuando usa el ayudante HTML para generar algún control a la vista, usa nombres de propiedad en la atribución de nombre de la entrada html:
Hace algo así:
Entonces, si necesita validar su propiedad en el método Validar, puede hacer esto:
En caso de que cambie el nombre de su propiedad utilizando herramientas de refactorización, su validación no se interrumpirá.
fuente
Otro caso de uso
nameof
es verificar las páginas de pestañas, en lugar de verificar el índice, puede verificar laName
propiedad de las páginas de pestañas de la siguiente manera:Menos desordenado :)
fuente
Me parece que
nameof
aumenta la legibilidad de las declaraciones SQL muy largas y complejas en mis aplicaciones. Hace que las variables se destaquen de ese mar de cadenas y elimina su trabajo de averiguar dónde se usan las variables en sus declaraciones SQL.fuente