Entwickler-Ecke

C# - Die Sprache - Felder mit { get; set {...} } möglich?


erfahrener Neuling - Di 17.05.16 13:39
Titel: Felder mit { get; set {...} } möglich?
Hallo,

normalerweise habe ich Felder meistens so festgelegt:

C#-Quelltext
1:
public string MyString { get; set; }                    
oder so:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
private string myString;

public string MyString 

    get { return this.myString; }
    set { this.myString = value }
}

Nun möchte ich aber eine Mischung aus beidem haben, d.h. ich habe keine extra Variable, will aber bei set noch etwas hinzufügen, etwa so:

C#-Quelltext
1:
2:
3:
4:
5:
public string MyString 

    get { return ?; }
    set { ? = value + "irgendwas"; }; 
}

Geht das irgendwie? Falls es nicht geht: Wo werden denn bei { get; set; } die Werte hergeholt/abgelegt?


Christian S. - Di 17.05.16 14:04

Hallo,

das wäre mir nicht bekannt, dass das geht. Dann müsstest Du ein privates Feld haben, welches im Hintergrund die Daten hält:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
private string myString;

public string MyString 

    get { return myString; }
    set { myString = value + "irgendwas"; }; 
}


Normalerweise würde man aber noch prüfen, ob beim setzen der neue Wert wirklich "neu" ist oder dem alten Wert entspricht. Dann kann man sich das Setzen (und evtl. Benachrichtigen, bei INotifyPropertyChanged) sparen.

Grüße
Christian


erfahrener Neuling - Di 17.05.16 14:21

Ok danke, dacht ich mir schon. :/


Ralf Jansen - Di 17.05.16 14:28

Versuch dich doch mal an einem Syntax in dem du eine bedeutende Menge an Code gegenüber klassischer Property Implementierung einsparen könntest und alle denkbaren Varianten von "will aber noch etwas hinzufügen" (näherungsweise) abdeckt. Da sollte schnell auffallen das der Gewinn an Kompaktheit so gering ist das sich das kaum lohnt. Gegenüber deinem Syntax mit =? fehlt doch nur noch die eine Zeile mit der Definition des dahinterliegenden Feldes.

Im allgemeinen Fall lohnt sich bei sowas dann einen Blick in die Aspect orientierte Ecke der Programmierung. In C# dann sowas wie PostSharp [https://www.postsharp.net/] wo man dann per Attribute Verhalten an eine Auto Property dranschrauben könnte. Das ist aber in diesem Fall mit Kanonen auf Spatzen geschossen ;)


Motz - Di 14.06.16 08:32

Du brauchst doch eine extra private Variable - sonst macht ja eine Eigenschaft gar keinen Sinn! Der Sinn ist ja, dass du einen Fremdzugriff auf eine private Variable genau kontrollieren kannst, um die Programmsicherheit zu gewährleisten