Was ist der Zweck von nameof?
Version 6.0 hat eine neue Funktion nameof
aber ich kann nicht verstehen, wozu das gut sein sollte, als es braucht nur der name der variable und ändert diese auf eine Schnur auf-Zusammenstellung.
Ich dachte, es hätte wohl einen Sinn, wenn mit <T>
aber wenn ich versuche zu nameof(T)
es druckt nur, mir ein T
statt des verwendeten Typs.
Jede Idee, die Zweck?
InformationsquelleAutor der Frage atikot | 2015-07-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was ist mit den Fällen, wo Sie wollen, um die Wiederverwendung der name einer Eigenschaft, zum Beispiel beim werfen von exception-basierend auf einer Eigenschaft Namen, oder die Handhabung eines
PropertyChanged
Veranstaltung. Es gibt zahlreiche Fälle, wo Sie möchten, um den Namen der Eigenschaft.Nehmen Sie dieses Beispiel:
Im ersten Fall umbenennen
SomeProperty
wird, ändern Sie den Namen der Eigenschaft zu, oder es wird brechen Zusammenstellung. Der Letzte Fall nicht.Dies ist eine sehr nützliche Möglichkeit, um Ihren code kompilieren und Fehler frei (sozusagen).
(A sehr schöner Artikel von Eric Lippert warum
infoof
haben es nicht geschafft, währendnameof
hat)InformationsquelleAutor der Antwort Patrick Hofman
Es ist wirklich nützlich für
ArgumentException
und seine Derivate:Nun, wenn jemand refactors die Namen der
input
parameter der Ausnahme, gehalten werden up-to-date zu sein.Ist es auch nützlich, in einigen Orten, wo zuvor Reflexion eingesetzt werden musste, um die Namen der Eigenschaften oder Parameter.
In deinem Beispiel
nameof(T)
ruft den Namen des Parameters "type" - dies kann nützlich sein, zu:Anderen Nutzung
nameof
ist für Enumerationen, die - in der Regel, wenn Sie möchten, dass die Zeichenfolge ist der name einer enum-verwenden Sie.ToString()
:Dies ist eigentlich relativ langsam .Netto hält die enum-Wert (d.h.
7
) und findet den Namen zur Laufzeit.Stattdessen
nameof
:Nun .Net ersetzt die enum-name mit einem string zur compile-Zeit.
Noch ein Einsatz ist für Dinge wie
INotifyPropertyChanged
und die Anmeldung - in beiden Fällen soll der name des Mitglieds, das Sie aufrufen, übergeben werden, auf eine andere Methode:... Oder
InformationsquelleAutor der Antwort Keith
Ihre Frage bereits zum Ausdruck des zwecks. Sie müssen sehen, könnte dies nützlich sein für die Anmeldung oder das werfen von Ausnahmen.
zum Beispiel.
dies ist gut, wenn ich den Namen der variable an, der code wird Pause einlegen oder wieder eine Ausnahme mit einer falschen Nachricht.
Natürlich, die verwendet werden, sind nicht beschränkt auf diese einfache situation. Sie können
nameof
Wann immer es würde nützlich sein, um code-der name einer Variablen oder Eigenschaft.Die Verwendungsmöglichkeiten sind vielfältig, wenn man bedenkt, verschiedenen verbindlichen und Reflexion der Situationen. Es ist eine hervorragende Möglichkeit, um, was waren Laufzeit-Fehler zur compile-Zeit.
InformationsquelleAutor der Antwort Jodrell
Den häufigsten Anwendungsfall, die ich denken kann, ist beim arbeiten mit der
INotifyPropertyChanged
- Schnittstelle. (Im Grunde alles rund um WPF und Bindungen benutzt diese Schnittstelle)Werfen Sie einen Blick auf dieses Beispiel:
Wie Sie sehen können, in der alten Weise, die wir haben, um eine Zeichenfolge übergeben, um anzugeben, welche Eigenschaft sich geändert hat. Mit
nameof
können wir den Namen der Eigenschaft direkt. Dies mag nicht wie eine große Sache. Aber Bild, was passiert, wenn jemand ändert den Namen der EigenschaftFoo
. Bei der Verwendung einer Zeichenfolge, die Bindung wird nicht mehr funktionieren, aber der compiler wird nicht warnen Sie. Bei der Verwendung von nameof erhalten Sie einen compiler-Fehler, dass es kein Eigentum/argument mit dem NamenFoo
.Beachten Sie, dass einige frameworks verwenden einige Reflexion Magie, um den Namen der Eigenschaft, aber jetzt haben wir nameof ist dies nicht mehr notwendig.
InformationsquelleAutor der Antwort Roy T.
Es gibt viele gute Antworten hier. Ich möchte eine weitere hinzufügen einen Anwendungsfall, wo diese
nameof
Features von C# 6.0 wird handlich. Betrachten einer Bibliothek wie Dapper was macht DB-Abfragen viel einfacher. Allerdings ist dies eine große Bibliothek, die Sie benötigen, um hardcode-Eigenschaft Namen in der Abfrage, die nicht lassen-compiler zu finden, der falsche Namen für die Eigenschaft. Mit der string-interpolation und nameof features, wird es viel einfacher und typesafe.Aus dem Beispiel im link
ohne nameof
var dog = connection.Query<Dog>("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid });
mit nameof
var dog = connection.Query<Dog>($"select {nameof(Dog.Age)} = @Age, {nameof(Dog.Id)} = @Id", new { Age = (int?)null, Id = guid });
InformationsquelleAutor der Antwort 5a7335h
Häufigste Verwendung wird in der Validierung von Eingaben, wie
Im ersten Fall, wenn Sie refactor-Methode ändern par parameter den Namen, die Sie wahrscheinlich vergessen zu ändern, dass in der ArgumentNullException. Mit nameof Sie nicht haben, um sorgen machen.
Siehe auch: nameof (C# und Visual Basic-Referenz)
InformationsquelleAutor der Antwort Massimo Prota
Berücksichtigen, dass Sie verwenden eine variable in Ihrem code und brauchen, um die Namen der Variablen und können sagen, es zu drucken, sollten Sie zu verwenden
Und wenn dann jemand refactors Sie den code und verwendet einen anderen Namen für "myVar", er/Sie hätte beobachten für Sie den string-Wert in Ihrem code und chenge es entsprechend.
Stattdessen, wenn Sie hatte
Es würde helfen, zu refaktorieren automatisch!
InformationsquelleAutor der Antwort cnom
Als andere haben bereits darauf hingewiesen, dass der
nameof
Betreiber übernimmt Sie den Namen, die das element war in den sourcecode.Möchte ich hinzufügen, dass dies eine wirklich gute Idee in Bezug auf die Umgestaltung, da macht es diese Zeichenfolge refactoring-safe. Bisher habe ich eine statische Methode, die verwertet Reflexion für den gleichen Zweck, die jedoch nicht, haben eine Laufzeit-performance zu beeinträchtigen. Die
nameof
Betreiber übernimmt keine Laufzeit-performance auswirken, tut es seine Arbeit auf die compile-Zeit. Wenn Sie einen Blick auf dieMSIL
- code finden Sie die Zeichenfolge eingebettet. Sehen Sie die folgende Methode, und seine disassemblierten code.Aber das kann von Nachteil sein, wenn Sie planen, zu verschleiern Ihre software. Nach der Verschleierung der embedded-Zeichenfolge kann nicht länger mit dem Namen des Elements. Mechanismen, die sich auf diesen text zu brechen. Beispiele für, die, einschließlich, aber nicht beschränkt auf: Reflexion, NotifyPropertyChanged ...
Bestimmung der Namen während der Laufzeit kostet etwas Leistung, aber ist sicher für Verschleierung. Wenn Verschleierung ist weder erforderlich noch geplant, ich würde empfehlen, die Wahl zu verwenden, die
nameof
Betreiber.InformationsquelleAutor der Antwort cel sharp
Den ASP.NET Core-MVC-Projekt verwendet
nameof
imAccountController.cs
undManageController.cs
mit derRedirectToAction
Methode eine Referenz zu einem action im controller.Beispiel:
Bedeutet dies:
und nimmt den Benutzer auf den 'Index' - action in der "Heimat" - controller, d.h.
/Home/Index
.InformationsquelleAutor der Antwort Fred
In dem MSDN-Artikel Listen MVC routing (das Beispiel, das wirklich angeklickt wird das Konzept für mich) unter mehreren anderen. Die (formatierte) Beschreibung Absatzes liest:
Akzeptierten /top bewerteten Antworten geben bereits einige sehr gute und konkrete Beispiele.
InformationsquelleAutor der Antwort brichins
Den Zweck der
nameof
Betreiber ist die Angabe der Quelle name des Artefakte.In der Regel den Namen der Quelle, ist der gleiche name, wie die Metadaten-name:
Dies ist jedoch nicht immer der Fall sein:
Oder:
Einen nutzen, die ich habe, die zu es ist für die Benennung von Ressourcen:
Ist die Tatsache, dass in diesem Fall, ich brauchte nicht einmal die erzeugte Eigenschaften auf die Ressourcen zugreifen, aber jetzt habe ich einen compile-Zeit überprüfen, dass die Ressourcen vorhanden sind.
InformationsquelleAutor der Antwort Paulo Morgado
Einer der Verwendung von
nameof
Schlüsselwort für die EinstellungBinding
im wpf programmgesteuert.setzen
Binding
müssen SiePath
mit string und mitnameof
Schlüsselwort, es ist möglich, Umgestalten option.Zum Beispiel, wenn Sie
IsEnable
Abhängigkeitseigenschaft in IhremUserControl
und Sie wollen binden Sie es anIsEnable
einigeCheckBox
in IhremUserControl
können Sie verwenden Sie diese zwei codes:und
Es ist offensichtlich, dass die erste code kann nicht umgestalten, aber die secend...
InformationsquelleAutor der Antwort Mehdi Khademloo
Zuvor wurden wir mit so etwas wie:
Grund - compile-time Sicherheit. Niemand kann automatisch umbenennen Eigentums-und break-code Logik. Nun können wir nameof().
InformationsquelleAutor der Antwort QtRoS
Es hat Vorteile, wenn Sie verwenden ASP.Net MVC. Wenn Sie HTML-helper zu bauen, eine gewisse Kontrolle in Sicht es nutzt die property-Namen in name attribure der html-Eingabe:
Macht es etwas wie das:
So, jetzt, wenn Sie brauchen, um zu überprüfen, Ihre Immobilie in der Validate-Methode, die Sie dies tun können:
Im Falle dass, wenn Sie benennen Sie die Eigenschaft mithilfe von refactoring-tools, die Ihre Validierung nicht gebrochen werden.
InformationsquelleAutor der Antwort digizard