Ich lerne ASP.NET MVC und kann englische Dokumente lesen, aber ich verstehe nicht wirklich, was in diesem Code passiert:
public class Genre
{
public string Name { get; set; }
}
Was bedeutet das : { get; set; }
?
c#
properties
kn3l
quelle
quelle
{get; set;}
, erstellen Sie ein Feld, aber wenn Sie das{get; set;}
setzen, erstellen Sie eine Eigenschaft . Eine Immobilie zu haben, könnte einige Dinge einfacher machen, insbesondere wenn Sie mit Reflection arbeiten.Antworten:
Es handelt sich um eine sogenannte Auto-Eigenschaft, die im Wesentlichen eine Abkürzung für Folgendes ist (ähnlicher Code wird vom Compiler generiert):
quelle
=
Operator überladen , aber nur für ein bestimmtes Element, oder?name
erstellt. Wenn Sie versucht haben, auf diese private Variable innerhalb der Klasse zu verweisen, schlägt dies fehl. Ich bin nicht sicher, wie C # das macht, aber es verhält sich so, als ob es eine private Variable ohne Namen gibt, auf die Sie in Ihrem Code nicht zugreifen können.Soweit ich weiß,
{ get; set; }
handelt es sich um eine "Auto-Eigenschaft", die genau wie @Klaus und @Brandon eine Abkürzung für das Schreiben einer Eigenschaft mit einem "Hintergrundfeld" darstellt. Also in diesem Fall:Wenn Sie jedoch wie ich sind - vor ungefähr einer Stunde -, verstehen Sie die Eigenschaften und Accessoren nicht wirklich und haben auch nicht das beste Verständnis für einige grundlegende Terminologien. MSDN ist ein großartiges Werkzeug, um solche Dinge zu lernen, aber für Anfänger ist es nicht immer leicht zu verstehen. Also werde ich versuchen, dies hier ausführlicher zu erklären.
get
undset
sind Accessoren , dh sie können auf Daten und Informationen in privaten Feldern zugreifen (normalerweise über ein Hintergrundfeld ) und dies normalerweise über öffentliche Eigenschaften (wie Sie im obigen Beispiel sehen können).Es ist nicht zu leugnen, dass die obige Aussage ziemlich verwirrend ist, also gehen wir auf einige Beispiele ein. Angenommen, dieser Code bezieht sich auf Musikgenres. Innerhalb des Klassengenres werden wir also verschiedene Musikgenres wollen. Angenommen, wir möchten drei Genres haben: Hip Hop, Rock und Country. Dazu verwenden wir den Namen der Klasse , um neue Instanzen dieser Klasse zu erstellen .
Nachdem wir die Instanzen der Genre-Klasse erstellt haben, können wir die Genre-Namen mithilfe der oben festgelegten Eigenschaft 'Name' festlegen.
Wir können den Namen 'g1' auf Hip Hop setzen, indem wir Folgendes schreiben
Was hier passiert, ist ziemlich komplex. Wie ich bereits sagte,
get
undset
greifen Sie auf Informationen aus privaten Feldern zu, auf die Sie sonst nicht zugreifen könnten.get
kann nur Informationen aus diesem privaten Feld lesen und zurückgeben.set
kann nur Informationen in dieses private Feld schreiben . Aber wenn wir eine Eigenschaft mit beiden habenget
undset
beide Funktionen ausführen können. Und indemg1.Name = "Hip Hop";
wir schreiben, verwenden wir speziell dieset
Funktion aus unserer Name-Eigenschaftset
verwendet eine implizite Variable namensvalue
. Grundsätzlich bedeutet dies, dass jedes Mal, wenn Sie "Wert" darin sehenset
, es sich auf eine Variable bezieht; die Variable "Wert". Wenn wir schreiben, verwendeng1.Name =
wir das=
, um dievalue
Variable zu übergeben, die in diesem Fall ist"Hip Hop"
. Sie können sich das also im Wesentlichen so vorstellen:Es ist wichtig zu beachten, dass das obige Beispiel nicht tatsächlich im Code geschrieben ist. Es ist eher ein hypothetischer Code, der darstellt, was im Hintergrund vor sich geht.
So , jetzt haben wir haben festgelegt , den Namen der g1 Instanz Genre , glaube ich , können wir erhalten den Namen von Schrift
und wenn wir dies ausführen würden, würden wir
"Hip Hop"
in unsere Konsole bekommen.Zum Zweck dieser Erklärung werde ich das Beispiel auch mit Ausgaben vervollständigen
Ausgabe:
quelle
set{name = value;} // 'value' here is equal to "Hip Hop"
get
und auf die Daten zugegriffen wirdset
. Der Link, den ich bereitgestellt habe, enthält ein hervorragendes Zitat von John Guttag oben auf der Seite. Ich würde empfehlen, sein Buch zu lesen oder sogar an diesem kostenlosen Online-Kurspublic class Genre{public string Name;}
anstelle von :public class Genre{ public string Name { get; set; }}
. Ich meine, warum brauchen wir überhaupt {get; einstellen; }?Das sind automatische Eigenschaften
Grundsätzlich eine andere Art, eine Eigenschaft mit einem Hintergrundfeld zu schreiben.
quelle
get
und bleibt bei der Verwendungset
). Wie der Schrank, zu demget
undset
öffnet die Tür von._name
. In der automatischen Eigenschaft ist das Hintergrundfeld ausgeblendet.Dies ist der kurze Weg, um dies zu tun:
quelle
Es ist eine Verknüpfung, um Datenelemente als öffentlich verfügbar zu machen, sodass Sie keine expliziten privaten Datenelemente erstellen müssen. C # erstellt ein privates Datenelement für Sie.
Sie könnten Ihre Datenelemente einfach öffentlich machen, ohne diese Verknüpfung zu verwenden. Wenn Sie jedoch die Implementierung des Datenelements ändern möchten, um eine gewisse Logik zu erhalten, müssen Sie die Schnittstelle unterbrechen. Kurz gesagt, es ist eine Abkürzung, um flexibleren Code zu erstellen.
quelle
Grundsätzlich ist es eine Abkürzung von:
quelle
Es ist eine automatisch implementierte Eigenschaft für C #.
quelle
get; set;
aufgerufen wird?null
wie jedestring
Variable bissomeInstanceOfGenere.Name = "someValue"
Sie sind die Accessoren für den Namen des öffentlichen Eigentums.
Sie würden sie verwenden, um den Wert dieser Eigenschaft in einer Instanz von Genre abzurufen / festzulegen.
quelle
Das ist eine automatisch implementierte Eigenschaft. Dies ist im Grunde eine Kurzform zum Erstellen von Eigenschaften für eine Klasse in C #, ohne dass private Variablen für diese definiert werden müssen. Sie werden normalerweise verwendet, wenn beim Abrufen oder Festlegen des Werts einer Variablen keine zusätzliche Logik erforderlich ist.
Weitere Informationen finden Sie im Programmierhandbuch für automatisch implementierte Eigenschaften von MSDN .
quelle
Das get / set-Muster bietet eine Struktur, mit der Logik während des Einstellens ('set') oder Abrufens ('get') einer Eigenschaftsinstanz einer instanziierten Klasse hinzugefügt werden kann. Dies kann nützlich sein, wenn eine Instanziierungslogik für die erforderlich ist Eigentum.
Eine Eigenschaft kann nur einen 'get'-Accessor haben, der ausgeführt wird, um diese Eigenschaft schreibgeschützt zu machen
Bei der Implementierung eines get / set-Musters wird eine Zwischenvariable als Container verwendet, in den ein Wert eingefügt und ein Wert extrahiert werden kann. Der Zwischenvariablen wird normalerweise ein Unterstrich vorangestellt. Diese Zwischenvariable ist privat, um sicherzustellen, dass nur über ihre get / set-Aufrufe auf sie zugegriffen werden kann. Siehe die Antwort von Brandon, da seine Antwort die am häufigsten verwendeten Syntaxkonventionen für die Implementierung von get / set zeigt.
quelle
Dies bedeutet, dass Sie beim Erstellen einer Variablen vom Typ Genre auf die Variable als Eigenschaft zugreifen können
quelle
Eine solche
{ get; set; }
Syntax wird als automatische Eigenschaften, C # 3.0-Syntax, bezeichnetZum Kompilieren müssen Sie Visual C # 2008 / csc v3.5 oder höher verwenden. Sie können jedoch Ausgaben kompilieren, die auf nur .NET Framework 2.0 abzielen (keine Laufzeit oder Klassen erforderlich, um diese Funktion zu unterstützen).
quelle
Wenn Sie
X
in Visual Studio eine Eigenschaft in einer Klasse definieren und diese Klasse nur als Typ verwenden möchten, erhalten Sie nach dem Erstellen Ihres Projekts eine Warnung mit der Meldung "Feld X wird niemals zugewiesen und hat immer seine Standardeinstellung Wert " .Durch das Hinzufügen einer
{ get; set; }
aufX
Eigenschaft, werden Sie diese Warnung nicht erhalten.Darüber hinaus können Sie in Visual Studio 2013 und höheren Versionen durch Hinzufügen
{ get; set; }
alle Verweise auf diese Eigenschaft anzeigen.quelle
Es ist im Grunde eine Abkürzung. Sie können
public string Name { get; set; }
wie in vielen Beispielen schreiben , aber Sie können es auch schreiben:Warum wird es verwendet? Es kann verwendet werden, um den Zugriff auf eine Eigenschaft zu filtern. Beispielsweise möchten Sie nicht, dass Namen Zahlen enthalten.
Lassen Sie mich Ihnen ein Beispiel geben:
Offiziell heißt es Auto-Implemented Properties und es ist eine gute Angewohnheit, das ( Programmierhandbuch ) zu lesen . Ich würde auch Tutorial Video C # Eigenschaften empfehlen : Warum "get" und "set" verwenden .
quelle
Get set sind Zugriffsmodifikatoren auf die Eigenschaft. Get liest das Eigenschaftsfeld. Set legt den Eigenschaftswert fest. Get ist wie ein schreibgeschützter Zugriff. Set ist wie Schreibzugriff. Um die Eigenschaft als Lese- und Schreibzugriff zu verwenden, müssen sowohl get als auch set verwendet werden.
quelle
Get wird aufgerufen, wenn die Eigenschaft auf der rechten Seite (RHS) angezeigt wird. Set wird aufgerufen, wenn die Eigenschaft auf der linken Seite (LHS) des Symbols '=' angezeigt wird
Bei einer automatisch implementierten Eigenschaft funktioniert das Hintergrundfeld hinter den Kulissen und ist nicht sichtbar.
Beispiel:
Während für eine nicht automatisch implementierte Eigenschaft das Hintergrundfeld im Voraus angezeigt wird und als Variable mit privatem Bereich sichtbar ist.
Beispiel:
Es ist auch erwähnenswert, dass hier der "Getter" und der "Setter" das unterschiedliche "Hintergrundfeld" verwenden können.
quelle
Definieren Sie die privaten Variablen
Im Konstruktor und laden Sie die Daten
Ich habe eine Konstante erstellt und lade die Daten von der Konstanten in die Klasse Ausgewählte Liste.
quelle
Eine Eigenschaft ähnelt einer Ebene, die die private Variable von anderen Mitgliedern einer Klasse trennt. Von außen fühlt es sich so an, als sei eine Eigenschaft nur ein Feld. Auf eine Eigenschaft kann mit .Property zugegriffen werden
FullName ist eine Eigenschaft. Der mit dem Pfeil ist eine Abkürzung. Von außerhalb können wir wie folgt auf FullName zugreifen:
Anrufer interessieren sich nicht dafür, wie Sie den vollständigen Namen implementiert haben. Aber innerhalb der Klasse können Sie FullName ändern, was Sie wollen.
Weitere Informationen finden Sie in der Microsoft-Dokumentation:
https://docs.microsoft.com/en-us/dotnet/csharp/properties
quelle