Sind C # -Eigenschaften tatsächlich Methoden?

77

Bis jetzt hatte ich den Eindruck, dass Properties& Methodszwei verschiedene Dinge in C # sind. Aber dann habe ich so etwas wie unten gemacht.

Geben Sie hier die Bildbeschreibung ein

und das war ein "Augenöffner" für mich. Ich hatte eine Eigenschaft stringPropund eine Methode erwartet , stringPropaber stattdessen bekam ich diese.

Warum ist das passiert? kann mir bitte jemand erklären.

Yogi
quelle
4
Es ist nicht wirklich klar, wonach Sie als Antwort suchen. Aber Properties sagt: "... es handelt sich tatsächlich um spezielle Methoden, die als Accessoren bezeichnet werden."
Damien_The_Unbeliever
30
Es ist nicht legal, eine Eigenschaft und Methode mit demselben Namen zu haben, daher wundert es mich nicht, dass Intellisense verwirrt ist.
Mike Zboray
Das ist nicht legal und der Versuch stringProp = stringProp();wird nicht kompiliert ( stringProp is a 'property' but is used like a 'method')
Alex
Beachten Sie, dass das, was Ihre Augen "geöffnet" hat, meiner Meinung nach ein Problem im Werkzeug ist, das die beiden Elemente als "Überlastungen" anzeigt. wobei die Namen der Methoden nichts miteinander zu tun haben. Die Zugriffsmethode hat nicht denselben Namen wie die Eigenschaft.
Iravanchi

Antworten:

113

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 .

dcastro
quelle
30
@ dc7a9163d9 Eigentlich <Age>k__BackingFieldist 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.
Dcastro
Ich habe eine Methode, die sowohl SET als auch GET ausführt. Es wäre großartig, wenn ich das wie eine Immobilie nennen könnte, ohne ()
Herman Van Der Blom
24

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_stringPropist 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:

Der Typ 'foo' enthält bereits eine Definition für 'stringProp'

pswg
quelle
2
Der größte Unterschied besteht darin, dass Eigenschaften über Attribute zusätzliche Metadaten zugeordnet werden können, die möglicherweise nicht für Methoden gelten.
Dan Bryant
18

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 NameEigenschaft in zwei Methoden konvertiert: get_Name()und set_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)

Tigran
quelle
-2

Ja. Eigenschaften sind mutatorMethoden.

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

Amir Saniyan
quelle