Lege ich ein Objekt person1 der Klasse Person an und rufe eine nicht existierende Eigenschaft auf, zum Beispiel person1.name so wird name rot gekringelt markiert.
Klicke ich mit der rechten Maustaste darauf, erscheint ein kleines blaues Rechteck mit dem Hinweistext: Optionen für die Bindung des ausgewählten Elements
Eigenschaftstub für name in namespace Person generieren
Feldstub für name in in namespace Person generieren
Bei Eigenschaft public string name { get; set; }
Bei Feldstub public string name;
Also generiert C# entweder eine Eigenschaft oder eine Variable.
Das ist soweit ok. Was ich vermisse, ist die Kombination von Beiden.
Sollte C# nicht eine Variable private name und gleichzeitig die Eigenschaft systematisch anders benennen, zum Beispiel als Name generieren.
Denn die Inhalte der Variable sollen ja nur durch die Eigenschaft angesprochen werden.
Notfalls kann man auf die Variable verzichten und nur mit der Eigenschaft arbeiten. Aber die Eigenschaft selbst kann keinen Wert speichern, dazu braucht sie eine Variable, eben name.
Ich vermisse hier eine Struktur etwa in der Art, die Variable ist immer klein geschrieben, die Eigenschaft groß.
Erst wird die Variable, danach die Eigenschaft generiert.
Natürlich kann ich das selbst so machen. Im meinem Buch wird der Variable ein Unterstrich vorangestellt. Halte ich persönlich für unschön.
Eigenschaft als eine Art Methode kannte ich vorher nicht. Habe ich es so richtig beschrieben oder habe ich was Wichtiges überlesen?
Terep
Die Struktur gibt es, und nennt sich Naming Guideline.
Felder sind immer private. Eigenschaften Variabel.
Felder sind nur Datenhalter und behalten niemals eine Logik. Eigenschaften können eine Logik beinhalten.
Siehe auch: readonly Felder in Subklasse verdecken und in geerbter Methode verwenden
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo Abt
Danke für die prompte Antwort.
Felder sind immer private. Eigenschaften Variabel.
Felder sind nur Datenhalter und behalten niemals eine Logik. Eigenschaften können eine Logik beinhalten.
Das ist klar. Ich vermisse nur eine Regel, Vorgabe bzw. Vereinbarung, wie Variable und Eigenschaft verknüpft werden.
Terep
Hi Terep,
ich verstehe deine Frage nicht so richtig, aber ich nehme an, du beziehst dich auf diese Konstruktion:
private int count = 0;
public int Count
{
get { return count; }
set { count = value; }
}
Das ist keine Regel oder Vereinbarung, daß ist ein Feld, das durch eine Eigenschaft zugreifbar ist. Übrigens exakt das gleiche, wie:
public int Count { get; set; }
Die einzige Konvention, die hier angewendet wird, ist die Naming Convention für Felder (klein und ohne Unterstrich) und Eigenschaften (groß).
Wenn das deine Frage nicht beantwortet, erklär uns mal, was du mit "Variable und Eigenschaft verknüpfen" meinst.
Christian
Weeks of programming can save you hours of planning
Hi MrSparkle
Was mich gestört hat, ist die „lose“ Konvention, Variable klein geschrieben, Eigenschaft groß bzw. mit oder ohne Bindestrich.
Andererseits kann man die Eigenschaft ja nicht mit einer Methode verwechseln und die Verknüpfung ist ja mit der Namensgleichheit gegeben.
Wahrscheinlich hat es mich irritiert, weil es für mich neu ist Eigenschaften neben Methoden zu haben.
Danke für das Nachfragen.
Terep
PS Ihr seid hier wirklich prompt. Das ist schön, dann kann man seine Sachen kopfmäßig gut abarbeiten.
Ja, es sind Konventionen. Und die sind eben "lose", d.h. wenn man sich nicht daran hält, läuft das Programm trotzdem. Aber wenn man sich daran hält, dann hat man eben nicht nur funktioniereneden Code, sondern auch gut lesbaren (besonders für andere Programmierer) und somit besser zu wartenden Code.
Google mal nach den Naming Conventions von Microsoft, die sind wirklich gut durchdacht und sinnvoll.
Christian
Weeks of programming can save you hours of planning
Hallo Terep,
ich vermute, du möchtest, dass VS einen weiteren Menüpunkt anbietet, mit dem Code für eine Kombination aus Feld und Eigenschaft generiert wird. Das wäre in der Tat praktisch, denn sonst hat man bei späteren Erweiterungen das Problem aus Automatische Properties: Eigener Setter ohne zugehörige private Variable. Möglich?. Leider gibt es das wohl trotzdem nicht.
BTW: Bei public string name { get; set; }
gibt es natürlich auch eine Variable nur wird diese automatisch vom Compiler generiert und ist daher im Quellcode nicht ersichtlich. Aber im compilierten (IL-)Code ist sie vorhanden. Der automatisch generierte Setter setzt sie, der automatisch generierte Getter liest sie aus. Dieser Punkt fällt - im Gegensatz zu der eigentlichen Frage den Menüpunkten in VS - jedoch unter [Hinweis] Wie poste ich richtig? Punkt 1.1.1.
herbivore
Hallo,
um das problem zu lösen hatte ich mir mal selbst ein Code-Snippet für VS geschrieben (die ganzen Infos findet man in der msdn).
z.b. generierte "Property" folgendes
private DataType _MyPropertyName;
public DataType MyPropertyName
{
get{return _MyPropertyName;}
set
{
if(_MyProperty != value)
{
_MyProperty = value
NotifyProprtyChanged(()=>MyProprtyName)
}
}
}
DataType, _MyPropertyName und MyPropertyName konnten dann durch den Benutzer ersetzt werden.
Den Snippet habe ich leider nicht mehr (ein Grund mehr für Datensicherung XD)
MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden!
*"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht."
*"Ignorance simplifies ANY problem."
*"Stoppt die Piraterie der Musikindustrie"