Bis jetzt hatte ich den Eindruck, dass Properties
& Methods
zwei verschiedene Dinge in C # sind. Aber dann habe ich so etwas wie unten gemacht.
und das war ein "Augenöffner" für mich. Ich hatte eine Eigenschaft stringProp
und eine Methode erwartet , stringProp
aber stattdessen bekam ich diese.
Warum ist das passiert? kann mir bitte jemand erklären.
stringProp = stringProp();
wird nicht kompiliert (stringProp is a 'property' but is used like a 'method'
)Antworten:
Ja, der Compiler generiert zwei get- und set-Methoden für eine Eigenschaft sowie ein privates Sicherungsfeld für eine automatisch implementierte Eigenschaft.
public int Age {get; set;}
wird das Äquivalent von:
private int <Age>k__BackingField; public int get_Age() { return <Age>k__BackingField; } public void set_Age(int age) { <Age>k__BackingField = age; }
Code, der auf Ihre Eigenschaft zugreift, wird kompiliert, um eine dieser beiden Methoden aufzurufen. Dies ist genau einer der Gründe, warum die Änderung eines öffentlichen Feldes in ein öffentliches Eigentum eine bahnbrechende Änderung darstellt.
Siehe Jon Skeets Warum Eigenschaften wichtig sind .
quelle
<Age>k__BackingField
ist der Name des Feldes. Obwohl dies ein illegaler Name in C # ist, ist er in IL (Intermediate Language) ein vollkommen gültiger Name. Dies ist die IL, die zum Deklarieren dieses Felds generiert wird :.field private int32 '<Age>k__BackingField'
. Die meisten vom Compiler generierten Typen wie Lambda-Closures und Enumeratoren enthalten<>
in ihren Namen.Streng genommen Eigenschaften sind diese Methoden nicht, obwohl sie sind in der Tat von Getter und Setter - Methoden unterstützt (auch genannt Accessoren). Wenn Sie Code wie diesen schreiben (vorausgesetzt, Sie ändern den Code, um den unten genannten Kompilierungsfehler zu beseitigen)
myFoo.stringProp = "bar";
Der Compiler generiert tatsächlich IL-Code wie folgt:
ldstr "bar" callvirt foo.set_stringProp
Wo
set_stringProp
ist die Setter-Methode für diese Eigenschaft? Wenn Sie dies wünschen, können Sie diese Methoden direkt über die Reflexion aufrufen.Das von Ihnen veröffentlichte Codebeispiel sieht in Intellisense von Visual Studio möglicherweise in Ordnung aus, wird jedoch nicht kompiliert. Wenn Sie versuchen, das Projekt zu erstellen, wird ein Fehler wie folgt angezeigt:
quelle
Dies ist ein Problem der visuellen Studiointelligenz, das nach Namen ausgewählt wird . Übrigens wird Ihr Code aufgrund der Namenskollision im selben Typ nicht einmal kompiliert.
Aber Sie haben Recht, dass Eigenschaften am Ende Methoden sind :
public class A { public string Name {get;set;} }
Hier wird die
Name
Eigenschaft in zwei Methoden konvertiert:get_Name()
undset_Name()
.In der Tat, wenn Sie Klasse wie folgt definieren:
public class A { public string Name {get;set;} public string get_Name() { return "aaa"; } }
Sie erhalten einen Kompilierungsfehler, da dieser bereits definiert ist
get_Name
(Eigenschaft)quelle
Ja. Eigenschaften sind
mutator
Methoden.In der Informatik ist eine Mutatormethode eine Methode, mit der Änderungen an einer Variablen gesteuert werden. Sie sind auch als Setter-Methoden bekannt. Oft wird ein Setter von einem Getter (auch als Accessor bezeichnet) begleitet, der den Wert der privaten Mitgliedsvariablen zurückgibt.
Die Mutatormethode wird am häufigsten in der objektorientierten Programmierung verwendet, um dem Prinzip der Kapselung zu entsprechen. Nach diesem Prinzip werden Mitgliedsvariablen einer Klasse privat gemacht, um sie zu verbergen und vor anderem Code zu schützen. Sie können nur von einer öffentlichen Mitgliedsfunktion (der Mutator-Methode) geändert werden, die optional den gewünschten neuen Wert als Parameter verwendet und validiert es und ändert die private Mitgliedsvariable.
Mutatormethoden können auch in nicht objektorientierten Umgebungen verwendet werden. In diesem Fall wird ein Verweis auf die zu ändernde Variable zusammen mit dem neuen Wert an den Mutator übergeben. In diesem Szenario kann der Compiler den Code nicht daran hindern, die Mutator-Methode zu umgehen und die Variable direkt zu ändern. Die Entwickler müssen sicherstellen, dass die Variable nur über die Mutator-Methode und nicht direkt geändert wird.
In Programmiersprachen, die sie unterstützen, bieten Eigenschaften eine bequeme Alternative, ohne auf den Nutzen der Kapselung zu verzichten.
Referenz: http://en.wikipedia.org/wiki/Mutator_method
quelle