Version 6.0 hat eine neue Funktion von nameof
, aber ich kann den Zweck nicht verstehen, da nur der Variablenname verwendet und beim Kompilieren in eine Zeichenfolge geändert wird.
Ich dachte, es könnte einen Zweck haben <T>
, wenn ich nameof(T)
es benutze, aber wenn ich es versuche, druckt es mir einfach ein T
anstelle des verwendeten Typs.
Irgendeine Idee zu diesem Zweck?
T
vorher keinen Weg, das zu bekommen . Es gab eine Möglichkeit, den verwendeten Typ vorher zu erhalten.nameof
. Hilft auch, Tippfehler zu vermeiden.Antworten:
Was ist mit Fällen, in denen Sie den Namen einer Eigenschaft wiederverwenden möchten, z. B. wenn Sie eine Ausnahme basierend auf einem Eigenschaftsnamen auslösen oder ein
PropertyChanged
Ereignis behandeln. Es gibt zahlreiche Fälle, in denen Sie den Namen der Immobilie haben möchten.Nehmen Sie dieses Beispiel:
Im ersten Fall
SomeProperty
ändert das Umbenennen auch den Namen der Eigenschaft, oder die Kompilierung wird unterbrochen. Der letzte Fall nicht.Dies ist eine sehr nützliche Methode, um Ihren Code kompiliert und fehlerfrei zu halten.
(Ein sehr schöner Artikel von Eric Lippert, warum er
infoof
es nicht geschafft hat, währendnameof
)quelle
nameof
und der Name der Aktion anstelle einer fest codierten Zeichenfolge.public class MyController { public ActionResult Index() { return View(nameof(Index)); } }
- und Sie können esnameof
für nicht statische Mitglieder verwenden (zum Beispiel können Sienameof(MyController.Index)
mit der obigen Klasse aufrufen und es wird "Index" ausgegeben). Schauen Sie sich die Beispiele unter msdn.microsoft.com/en-us/library/…Es ist wirklich nützlich für
ArgumentException
und seine Derivate:Wenn nun jemand den Namen des
input
Parameters umgestaltet, wird auch die Ausnahme auf dem neuesten Stand gehalten.Es ist auch an einigen Stellen nützlich, an denen zuvor Reflexionen verwendet werden mussten, um die Namen von Eigenschaften oder Parametern zu erhalten.
In Ihrem Beispiel
nameof(T)
wird der Name des Typparameters abgerufen - dies kann auch nützlich sein:Eine andere Verwendung von
nameof
ist für Aufzählungen - normalerweise, wenn Sie den Zeichenfolgennamen einer Aufzählung möchten, die Sie verwenden.ToString()
:Dies ist tatsächlich relativ langsam, da .Net den Aufzählungswert (dh
7
) enthält und den Namen zur Laufzeit findet.Verwenden Sie stattdessen
nameof
:Jetzt ersetzt .Net den Namen der Aufzählung zur Kompilierungszeit durch eine Zeichenfolge.
Eine weitere Verwendung ist das
INotifyPropertyChanged
Protokollieren. In beiden Fällen möchten Sie, dass der Name des aufgerufenen Mitglieds an eine andere Methode übergeben wird:Oder...
quelle
typeof(T)
, das ist ein weiteres Stück Zucker zur Kompilierungszeit, das unter ähnlichen Umständen nützlich ist :-)nameofthismethod
. Sie können verwenden,Log.Error($"Error in {nameof(DoSomething)}...")
aber wenn Sie dies kopieren und in andere Methoden einfügen, werden Sie nicht bemerken, dass es sich immer noch darauf beziehtDoSomething
. Während es perfekt mit lokalen Variablen oder Parametern funktioniert, ist der Methodenname ein Problem.nameOf
das[DisplayName]
Attribut verwendet wird, falls vorhanden? Für dasenum
Beispiel, das ich[DisplayName]
oft mit MVC-Projekten verwendethrow new
ist jedoch ein ganz anderes Anti-Muster - ich findecatch
, dass Überbeanspruchung ein häufiges Problem bei Junior-Entwicklern ist, weil es sich anfühlt, als würde man das Problem beheben (wenn es die meiste Zeit nur versteckt ist).Ein weiterer Anwendungsfall, bei dem die
nameof
Funktion von C # 6.0 nützlich ist - Stellen Sie sich eine Bibliothek wie Dapper vor, die das Abrufen von DBs erheblich vereinfacht. Obwohl dies eine großartige Bibliothek ist, müssen Sie die Eigenschafts- / Feldnamen in der Abfrage fest codieren. Dies bedeutet, dass bei einer Umbenennung Ihrer Eigenschaft / Ihres Feldes die Wahrscheinlichkeit groß ist, dass Sie vergessen, die Abfrage zu aktualisieren, um neue Feldnamen zu verwenden. Durch die Interpolation undnameof
Funktionen von Zeichenfolgen wird Code viel einfacher zu warten und typsicher.Aus dem Beispiel im Link
ohne nameof
mit nameof
quelle
Ihre Frage drückt bereits den Zweck aus. Sie müssen sehen, dass dies nützlich sein kann, um Ausnahmen zu protokollieren oder auszulösen.
beispielsweise.
Dies ist gut, wenn ich den Namen der Variablen ändere, wird der Code stattdessen unterbrochen oder es wird eine Ausnahme mit einer falschen Nachricht zurückgegeben .
Natürlich sind die Verwendungen nicht auf diese einfache Situation beschränkt. Sie können verwenden,
nameof
wann immer es nützlich wäre, den Namen einer Variablen oder Eigenschaft zu codieren.Die Verwendungsmöglichkeiten sind vielfältig, wenn Sie verschiedene Bindungs- und Reflexionssituationen berücksichtigen. Es ist eine hervorragende Möglichkeit, Laufzeitfehler in die Kompilierungszeit einzubeziehen.
quelle
OnPropertyChanged
Methoden erstellt wurden (die eher Eigenschaftsnamen als akzeptierenPropertyChangedEventArgs
), oder Aufrufe zur Reflexion, um nach einer bestimmten zu suchen Mitglied oder Typ?Der häufigste Anwendungsfall, an den ich denken kann, ist die Arbeit mit der
INotifyPropertyChanged
Schnittstelle. (Grundsätzlich verwendet alles, was mit WPF und Bindungen zu tun hat, diese Schnittstelle.)Schauen Sie sich dieses Beispiel an:
Wie Sie auf die alte Weise sehen können, müssen wir eine Zeichenfolge übergeben, um anzugeben, welche Eigenschaft sich geändert hat. Mit können
nameof
wir den Namen der Immobilie direkt verwenden. Dies scheint keine große Sache zu sein. Aber stellen Sie sich vor, was passiert, wenn jemand den Namen der Immobilie ändertFoo
. Bei Verwendung einer Zeichenfolge funktioniert die Bindung nicht mehr, der Compiler warnt Sie jedoch nicht. Wenn Sie nameof verwenden, erhalten Sie einen Compilerfehler, dass der Name keine Eigenschaft / kein Argument enthältFoo
.Beachten Sie, dass einige Frameworks Reflexionsmagie verwenden, um den Namen der Eigenschaft zu erhalten, aber jetzt haben wir den Namen, dass dies nicht mehr erforderlich ist .
quelle
[CallerMemberName]
Attribut für den Parameter einer neuen Methode zu verwenden, um dieses Ereignis auszulösen.[CallerMemberName]string x = null
es besser ist alsnameof(Property)
. Man könnte sagen, der Eigenschaftsname wird zweimal verwendet, aber das ist im Grunde das Argument, das an eine Funktion übergeben wird. Nicht wirklich was mit DRY gemeint ist denke ich :).nameof
ist, dass der Eigenschaftssetzer den Eigenschaftsnamen überhaupt nicht angeben muss, wodurch die Möglichkeit von Fehlern beim Kopieren / Einfügen ausgeschlossen wird.INotifyPropertyChanged
,[CallerMemberNameAttribute]
wenn Sie mithilfe der Option die Änderungsbenachrichtigung von einem Eigenschaftssetzer sauber auslösen können, während dienameof
Syntax die saubere Benachrichtigung von einem anderen Ort in Ihrem Code aus ermöglicht.Die häufigste Verwendung ist die Eingabevalidierung, z
Wenn Sie im ersten Fall die Methode umgestalten, die den Namen des Par- Parameters ändert , werden Sie wahrscheinlich vergessen, dies in der ArgumentNullException zu ändern . Mit nameof müssen Sie sich darüber keine Sorgen machen.
Siehe auch: nameof (C # und Visual Basic-Referenz)
quelle
Das ASP.NET Core MVC-Projekt verwendet
nameof
inAccountController.cs
undManageController.cs
mit derRedirectToAction
Methode, um auf eine Aktion im Controller zu verweisen.Beispiel:
Dies bedeutet:
und führt den Benutzer zur Aktion 'Index' im 'Home'-Controller, d
/Home/Index
. h .quelle
return RedirectToAction(nameof(HomeController.Index), nameof(HomeController).Substring(nameof(HomeController),0,nameof(HomeController).Length-"Controller".Length));
?Wie andere bereits betont haben,
nameof
fügt der Operator den Namen ein, den das Element im Quellcode angegeben hat.Ich möchte hinzufügen, dass dies eine wirklich gute Idee in Bezug auf das Refactoring ist, da es dieses String-Refactoring sicher macht. Zuvor habe ich eine statische Methode verwendet, bei der die Reflexion für denselben Zweck verwendet wurde, die sich jedoch auf die Laufzeitleistung auswirkt. Der
nameof
Bediener hat keine Auswirkungen auf die Laufzeitleistung. Es erledigt seine Arbeit zur Kompilierungszeit. Wenn Sie sich denMSIL
Code ansehen , finden Sie die eingebettete Zeichenfolge. Siehe die folgende Methode und ihren zerlegten Code.Dies kann jedoch ein Nachteil sein, wenn Sie Ihre Software verschleiern möchten. Nach der Verschleierung stimmt die eingebettete Zeichenfolge möglicherweise nicht mehr mit dem Namen des Elements überein. Mechanismen, die sich auf diesen Text stützen, brechen ab. Beispiele dafür, einschließlich, aber nicht beschränkt auf, sind: Reflection, NotifyPropertyChanged ...
Das Ermitteln des Namens zur Laufzeit kostet etwas Leistung, ist jedoch sicher zu verschleiern. Wenn eine Verschleierung weder erforderlich noch geplant ist, würde ich die Verwendung des
nameof
Operators empfehlen .quelle
Bedenken Sie, dass Sie eine Variable in Ihrem Code verwenden und den Namen der Variablen abrufen müssen. Sagen wir, Sie müssen sie verwenden
Und wenn dann jemand den Code umgestaltet und einen anderen Namen für "myVar" verwendet, müsste er / sie auf den Zeichenfolgenwert in Ihrem Code achten und ihn entsprechend ändern.
Stattdessen, wenn Sie hatten
Es würde helfen, automatisch umzugestalten!
quelle
Type
und den Wert enthält. Dies würde es Code ermöglichen, Protokollierungsmethoden aufzurufen, um viel Redundanz zu beseitigen.Der MSDN-Artikel listet unter anderem das MVC-Routing (das Beispiel, das für mich wirklich auf das Konzept geklickt hat) auf. Der (formatierte) Beschreibungsabsatz lautet:
Die akzeptierten / am besten bewerteten Antworten geben bereits einige hervorragende konkrete Beispiele.
quelle
Der Zweck des
nameof
Operators besteht darin, den Quellennamen der Artefakte anzugeben.Normalerweise ist der Quellenname derselbe Name wie der Metadatenname:
Dies ist jedoch möglicherweise nicht immer der Fall:
Oder:
Eine Verwendung, die ich ihm gegeben habe, ist das Benennen von Ressourcen:
Tatsache ist, dass ich in diesem Fall nicht einmal die generierten Eigenschaften für den Zugriff auf die Ressourcen benötigte, sondern jetzt eine Überprüfung der Kompilierungszeit habe, ob die Ressourcen vorhanden sind.
quelle
Ein
nameof
Schlüsselwort wird zum programmgesteuerten EinstellenBinding
von wpf verwendet .Zum Festlegen müssen
Binding
SiePath
mit Zeichenfolge und mitnameof
Schlüsselwort festlegen. Es ist möglich, die Refactor-Option zu verwenden.Wenn Sie beispielsweise eine
IsEnable
Abhängigkeitseigenschaft in Ihrer habenUserControl
und diese anIsEnable
einigeCheckBox
in Ihrer binden möchtenUserControl
, können Sie diese beiden Codes verwenden:und
Es ist offensichtlich, dass der erste Code nicht umgestaltet werden kann, aber der zweite ...
quelle
Zuvor haben wir so etwas verwendet:
Grund - Zeitsicherheit kompilieren. Niemand kann die Eigenschaft stillschweigend umbenennen und die Codelogik unterbrechen. Jetzt können wir nameof () verwenden.
quelle
Dies ist von Vorteil, wenn Sie ASP.Net MVC verwenden. Wenn Sie den HTML-Helfer verwenden, um ein Steuerelement in der Ansicht zu erstellen, werden Eigenschaftsnamen in der Namenszuordnung der HTML-Eingabe verwendet:
Es macht so etwas:
Wenn Sie nun Ihre Eigenschaft in der Validate-Methode validieren müssen, können Sie Folgendes tun:
Wenn Sie Ihre Eigenschaft mithilfe von Refactoring-Tools umbenennen, wird Ihre Validierung nicht unterbrochen.
quelle
Ein weiterer Anwendungsfall von
nameof
ist das Überprüfen von Registerkarten. Anstatt den Index zu überprüfen, können Sie dieName
Eigenschaften der Registerkarten wie folgt überprüfen :Weniger chaotisch :)
quelle
Ich finde, dass dies
nameof
die Lesbarkeit sehr langer und komplexer SQL-Anweisungen in meinen Anwendungen erhöht. Dadurch heben sich die Variablen von diesem Meer von Zeichenfolgen ab und Sie müssen nicht mehr herausfinden, wo die Variablen in Ihren SQL-Anweisungen verwendet werden.quelle