La version 6.0 a une nouvelle fonctionnalité nameof
, mais je ne comprends pas le but de celle-ci, car elle prend simplement le nom de la variable et le change en chaîne lors de la compilation.
Je pensais que cela pourrait avoir un but lors de l'utilisation, <T>
mais lorsque j'essaye, nameof(T)
cela m'imprime juste un T
au lieu du type utilisé.
Une idée sur le but?
T
avant. Il y avait un moyen d'obtenir le type utilisé auparavant.nameof
. Aide également à prévenir les fautes de frappe.[Test, TestCaseSource(typeof(MyDataClass), "TestCases")]
, qui peut être remplacé par[Test, TestCaseSource(typeof(MyDataClass), nameof(MyDataClass.TestCases))]
. Beaucoup mieux.Réponses:
Qu'en est-il des cas où vous souhaitez réutiliser le nom d'une propriété, par exemple lors du lancement d'une exception basée sur un nom de propriété ou de la gestion d'un
PropertyChanged
événement. Il existe de nombreux cas où vous voudriez avoir le nom de la propriété.Prenez cet exemple:
Dans le premier cas,
SomeProperty
le changement de nom modifiera également le nom de la propriété ou interrompra la compilation. Le dernier cas ne fonctionne pas.C'est un moyen très utile de garder votre code compilé et sans bug (sorte de).
(Un très bel article d'Eric Lippert pourquoi
infoof
ne l'a pas fait, alors qu'il l'anameof
fait)la source
nameof
et le nom de l'action au lieu d'une chaîne codée en dur.public class MyController { public ActionResult Index() { return View(nameof(Index)); } }
- et vous pouvez l'utilisernameof
sur des membres non statiques (par exemple, vous pouvez appeler ennameof(MyController.Index)
utilisant la classe ci-dessus et elle émettra "Index"). Consultez les exemples sur msdn.microsoft.com/en-us/library/…C'est vraiment utile pour
ArgumentException
et ses dérivés:Maintenant, si quelqu'un refactorise le nom du
input
paramètre, l'exception sera également mise à jour.Il est également utile dans certains endroits où auparavant la réflexion devait être utilisée pour obtenir les noms des propriétés ou des paramètres.
Dans votre exemple,
nameof(T)
obtient le nom du paramètre type - cela peut également être utile:Une autre utilisation de
nameof
est pour les énumérations - généralement si vous voulez le nom de chaîne d'une énumération que vous utilisez.ToString()
:C'est en fait relativement lent car .Net détient la valeur enum (c'est-à-dire
7
) et trouve le nom au moment de l'exécution.Utilisez plutôt
nameof
:Désormais .Net remplace le nom de l'énumération par une chaîne au moment de la compilation.
Encore une autre utilisation est pour des choses comme
INotifyPropertyChanged
et la journalisation - dans les deux cas, vous voulez que le nom du membre que vous appelez soit transmis à une autre méthode:Ou...
la source
typeof(T)
, qui est un autre morceau de sucre à la compilation qui est utile dans des circonstances similaires :-)nameofthismethod
. Vous pouvez utiliser,Log.Error($"Error in {nameof(DoSomething)}...")
mais si vous copiez-collez cela vers d'autres méthodes, vous ne remarquerez pas qu'il fait toujours référence àDoSomething
. Ainsi, même s'il fonctionne parfaitement avec des variables ou des paramètres locaux, le nom de la méthode pose problème.nameOf
va utiliser l'[DisplayName]
attribut s'il est présent? Pour l'enum
exemple que j'utilise[DisplayName]
souvent avec les projets MVCthrow new
un tout autre anti-modèle - je trouvecatch
que la surutilisation est un problème commun avec les développeurs juniors parce que cela ressemble à résoudre le problème (la plupart du temps, il ne fait que le cacher).Un autre cas d'utilisation où la
nameof
fonctionnalité de C # 6.0 devient pratique - Considérez une bibliothèque comme Dapper qui facilite les récupérations de bases de données. Bien qu'il s'agisse d'une excellente bibliothèque, vous devez coder en dur les noms de propriété / champ dans la requête. Cela signifie que si vous décidez de renommer votre propriété / champ, il y a de fortes chances que vous oubliez de mettre à jour la requête pour utiliser de nouveaux noms de champ. Avec l'interpolation et lesnameof
fonctionnalités de chaîne , le code devient beaucoup plus facile à maintenir et à sécuriser.De l'exemple donné dans le lien
sans nom
avec nameof
la source
Votre question exprime déjà le but. Vous devez voir que cela peut être utile pour la journalisation ou le lancement d'exceptions.
par exemple.
c'est bien, si je change le nom de la variable, le code se cassera à la place ou retournera une exception avec un message incorrect .
Bien entendu, les utilisations ne se limitent pas à cette simple situation. Vous pouvez utiliser
nameof
chaque fois qu'il serait utile de coder le nom d'une variable ou d'une propriété.Les utilisations sont multiples lorsque l'on considère diverses situations de reliure et de réflexion. C'est un excellent moyen d'apporter ce qui était des erreurs d'exécution pour compiler le temps.
la source
OnPropertyChanged
méthodes personnalisées (qui acceptent directement les noms de propriété plutôt quePropertyChangedEventArgs
), ou des appels à la réflexion pour rechercher un particulier membre ou type?Le cas d'utilisation le plus courant auquel je peux penser est lorsque vous travaillez avec l'
INotifyPropertyChanged
interface. (Fondamentalement, tout ce qui concerne WPF et les liaisons utilise cette interface)Jetez un œil à cet exemple:
Comme vous pouvez le voir à l'ancienne, nous devons passer une chaîne pour indiquer quelle propriété a changé. Avec
nameof
nous pouvons utiliser directement le nom de la propriété. Cela pourrait ne pas sembler être un gros problème. Mais imaginez ce qui se passe lorsque quelqu'un change le nom de la propriétéFoo
. Lorsque vous utilisez une chaîne, la liaison cessera de fonctionner, mais le compilateur ne vous avertira pas. Lorsque vous utilisez nameof, vous obtenez une erreur de compilation qu'il n'y a pas de propriété / argument avec le nomFoo
.Notez que certains frameworks utilisent de la magie de réflexion pour obtenir le nom de la propriété, mais maintenant nous avons nameof ce n'est plus nécessaire .
la source
[CallerMemberName]
attribut sur le paramètre d'une nouvelle méthode pour déclencher cet événement.[CallerMemberName]string x = null
c'est mieux quenameof(Property)
. Vous pourriez dire que le nom de la propriété est utilisé deux fois, mais c'est essentiellement l'argument passé à une fonction. Pas vraiment ce que l'on entend par DRY je pense :).nameof
est que le configurateur de propriétés n'a pas besoin de spécifier du tout le nom de la propriété, éliminant ainsi la possibilité de copier / coller de bogues.INotifyPropertyChanged
utilisation de[CallerMemberNameAttribute]
permet à la notification de changement d'être proprement levée à partir d'un configurateur de propriétés, tandis que lanameof
syntaxe permet à une notification de changement d'être proprement levée à partir d'un emplacement différent dans votre code.L'utilisation la plus courante sera dans la validation des entrées, comme
En premier cas, si vous refactoring la méthode changer par le nom de paramètre, vous oublierez probablement changer que dans le ArgumentNullException . Avec nameof, vous n'avez pas à vous en soucier.
Voir aussi: nameof (référence C # et Visual Basic)
la source
Le projet ASP.NET Core MVC utilise
nameof
dansAccountController.cs
etManageController.cs
avec laRedirectToAction
méthode pour référencer une action dans le contrôleur.Exemple:
Cela se traduit par:
et prend prend l'utilisateur à l'action «Index» dans le contrôleur «Accueil», à savoir
/Home/Index
.la source
return RedirectToAction(nameof(HomeController.Index), nameof(HomeController).Substring(nameof(HomeController),0,nameof(HomeController).Length-"Controller".Length));
?Comme d'autres l'ont déjà souligné, l'
nameof
opérateur insère le nom que l'élément a été donné dans le code source.Je voudrais ajouter que c'est une très bonne idée en termes de refactoring car cela rend cette refactoring de chaîne sûre. Auparavant, j'utilisais une méthode statique qui utilisait la réflexion dans le même but, mais qui a un impact sur les performances d'exécution. L'
nameof
opérateur n'a aucun impact sur les performances d'exécution; il fait son travail au moment de la compilation. Si vous regardez leMSIL
code, vous trouverez la chaîne intégrée. Voir la méthode suivante et son code désassemblé.Cependant, cela peut être un inconvénient si vous prévoyez d'obscurcir votre logiciel. Après l'obscurcissement, la chaîne incorporée peut ne plus correspondre au nom de l'élément. Les mécanismes qui s'appuient sur ce texte se briseront. Des exemples pour cela, y compris, mais sans s'y limiter, sont: Reflection, NotifyPropertyChanged ...
La détermination du nom pendant l'exécution coûte quelques performances, mais est sans danger pour l'obscurcissement. Si l'obscurcissement n'est ni requis ni prévu, je recommanderais d'utiliser l'
nameof
opérateur.la source
Considérez que vous utilisez une variable dans votre code et que vous devez obtenir le nom de la variable et disons l'imprimer, vous devriez avoir à utiliser
Et si quelqu'un refactorise le code et utilise un autre nom pour "myVar", il devra surveiller la valeur de la chaîne dans votre code et la modifier en conséquence.
Au lieu de cela, si vous aviez
Cela aiderait à refactoriser automatiquement!
la source
Type
et la valeur. Cela permettrait au code d'invoquer des méthodes de journalisation pour éliminer beaucoup de redondance.L'article MSDN répertorie le routage MVC (l'exemple qui a vraiment cliqué sur le concept pour moi) parmi plusieurs autres. Le paragraphe de description (formaté) se lit comme suit:
Les réponses acceptées / les mieux notées donnent déjà plusieurs excellents exemples concrets.
la source
Le but de la
nameof
opérateur est de fournir le nom source des artefacts.Habituellement, le nom de la source est le même que le nom des métadonnées:
Mais ce n'est pas toujours le cas:
Ou:
Une utilisation que je lui ai donnée est pour nommer les ressources:
Le fait est que, dans ce cas, je n'avais même pas besoin des propriétés générées pour accéder aux ressources, mais maintenant j'ai un temps de compilation pour vérifier que les ressources existent.
la source
L'une des utilisations de
nameof
mot-clé est de définirBinding
par programme wpf .pour définir,
Binding
vous devez définirPath
avec une chaîne et avec unnameof
mot clé, il est possible d'utiliser l'option Refactor.Par exemple, si vous avez
IsEnable
une propriété de dépendance dans votreUserControl
et que vous souhaitez la lier àIsEnable
certainesCheckBox
de vosUserControl
, vous pouvez utiliser ces deux codes:et
Il est évident que le premier code ne peut pas être refactorisé mais le second ...
la source
Auparavant, nous utilisions quelque chose comme ça:
Raison - compiler la sécurité du temps. Personne ne peut renommer silencieusement une propriété et rompre la logique du code. Maintenant, nous pouvons utiliser nameof ().
la source
Il présente un avantage lorsque vous utilisez ASP.Net MVC. Lorsque vous utilisez l'aide HTML pour créer un contrôle dans la vue, il utilise des noms de propriété dans l'attribution de nom de l'entrée html:
Cela fait quelque chose comme ça:
Alors maintenant, si vous devez valider votre propriété dans la méthode Validate, vous pouvez le faire:
Si vous renommez votre propriété à l'aide d'outils de refactoring, votre validation ne sera pas interrompue.
la source
Un autre cas d'utilisation de
nameof
consiste à vérifier les pages à onglets, au lieu de vérifier l'index, vous pouvez vérifier laName
propriété des pages à onglets comme suit:Moins salissant :)
la source
Je trouve que cela
nameof
augmente la lisibilité des instructions SQL très longues et complexes dans mes applications. Il fait ressortir les variables de cet océan de chaînes et élimine votre tâche de déterminer où les variables sont utilisées dans vos instructions SQL.la source