Getter und Setter (II) oder Auto-Implemented Properties in "immutable Objects"
C# .Net
Hatte mich ja mal in einem Blog darüber ausgelassen, was ich von Getter und Setter halte
OK, kann man ja geteilter Meinung sein, auch finde ich es vollkommen OK, dass es jetzt sowas wie Auto-Implemented Properties gibt. Warum nicht Ich sage jetzt dazu einfach nichts!!!!
Aber ......
Kategorie Hatte mich ja mal in einem Blog darüber ausgelassen, was ich von Getter und Setter halte
OK, kann man ja geteilter Meinung sein, auch finde ich es vollkommen OK, dass es jetzt sowas wie Auto-Implemented Properties gibt. Warum nicht Ich sage jetzt dazu einfach nichts!!!!
Aber ......
was ich unheimlich zum Kopf gegen die Wand
schlagen finde ist, dass man den Programmieren den folgenden Hinweis gibt
->
Also hier mal ein Beispiel, bei dem es nicht funktioniert
namespace Test {
public className {
public string FirstName {
get;
set;
}
public string LastName {
get;
set;
}
}
public classCustomer {
public Name CommonName {
get;
private set;
}
public int ID {
get;
private set;
}
public Customer( Name xCommonName, int xID) {
CommonName = xCommonName;
ID = xID;
}
public overridestring ToString() {
return CommonName.FirstName + " - " + CommonName.LastName;
}
}
class Program {
private staticvoid Main(string[] args) {
Name n = newName();
n.FirstName = "Joerg";
n.LastName = "Reck";
Customer c = newCustomer(n,1);
System.Console.WriteLine(c);
n.FirstName = "Alles ... ";
n.LastName = "Peanuts";
System.Console.WriteLine(c);
System.Console.ReadLine();
}
}
}
OK, geht nicht ... "Habe doch alles nach MSDN gemacht!!!"
Ach man, dann machen wir es halt so, wir kopieren im Constructor die Daten in ein neues Objekt NAME
Änderung im Constructor wie folgt ->
public Customer( Name xCommonName, int xID) {
CommonName = newName();
CommonName.FirstName = xCommonName.FirstName;
CommonName.LastName = xCommonName.LastName;
ID = xID;
}
Nochmal laufen lassen und freu, jetzt geht es .....
Wenn man sich da mal nicht zu früh freut, ändere doch mal die Main-Methode wie folgt ->
classProgram {
private staticvoid Main(string[] args) {
Name n = newName();
n.FirstName = "Joerg";
n.LastName = "Reck";
Customer c = newCustomer(n,1);
System.Console.WriteLine(c);
n = c.CommonName;
n.FirstName = "Alles ... ";
n.LastName = "Peanuts";
System.Console.WriteLine(c);
System.Console.ReadLine();
}
}
Shit!!!!!
Also Auto-Implemented bei CommonName wie folgt entfernen ->
private Name _CommonName;
public Name CommonName {
get {
Name c = new Name();
c.FirstName = _CommonName.FirstName;
c.LastName = _CommonName.LastName;
return c;
}
}
Jetzt scheint es "immutable" zu sein, aber ich habe ja auch keine "Auto-Implemented Properties" mehr.....
Gruß JJR
P.S.: Wer braucht neue Features mit Hinweisen, welche mich nur noch näher an den Abgrund bringen?
Also hier mal ein Beispiel, bei dem es nicht funktioniert
namespace Test {
public className {
public string FirstName {
get;
set;
}
public string LastName {
get;
set;
}
}
public classCustomer {
public Name CommonName {
get;
private set;
}
public int ID {
get;
private set;
}
public Customer( Name xCommonName, int xID) {
CommonName = xCommonName;
ID = xID;
}
public overridestring ToString() {
return CommonName.FirstName + " - " + CommonName.LastName;
}
}
class Program {
private staticvoid Main(string[] args) {
Name n = newName();
n.FirstName = "Joerg";
n.LastName = "Reck";
Customer c = newCustomer(n,1);
System.Console.WriteLine(c);
n.FirstName = "Alles ... ";
n.LastName = "Peanuts";
System.Console.WriteLine(c);
System.Console.ReadLine();
}
}
}
OK, geht nicht ... "Habe doch alles nach MSDN gemacht!!!"
Ach man, dann machen wir es halt so, wir kopieren im Constructor die Daten in ein neues Objekt NAME
Änderung im Constructor wie folgt ->
public Customer( Name xCommonName, int xID) {
CommonName = newName();
CommonName.FirstName = xCommonName.FirstName;
CommonName.LastName = xCommonName.LastName;
ID = xID;
}
Nochmal laufen lassen und freu, jetzt geht es .....
Wenn man sich da mal nicht zu früh freut, ändere doch mal die Main-Methode wie folgt ->
classProgram {
private staticvoid Main(string[] args) {
Name n = newName();
n.FirstName = "Joerg";
n.LastName = "Reck";
Customer c = newCustomer(n,1);
System.Console.WriteLine(c);
n = c.CommonName;
n.FirstName = "Alles ... ";
n.LastName = "Peanuts";
System.Console.WriteLine(c);
System.Console.ReadLine();
}
}
Shit!!!!!
Also Auto-Implemented bei CommonName wie folgt entfernen ->
private Name _CommonName;
public Name CommonName {
get {
Name c = new Name();
c.FirstName = _CommonName.FirstName;
c.LastName = _CommonName.LastName;
return c;
}
}
Jetzt scheint es "immutable" zu sein, aber ich habe ja auch keine "Auto-Implemented Properties" mehr.....
Gruß JJR
P.S.: Wer braucht neue Features mit Hinweisen, welche mich nur noch näher an den Abgrund bringen?
Kommentare
hier hast du wohl tatsächlich etwas zu viel von C# erwartet... Sobald der Typ des Properties ein Referenztyp ist, geht das mit auto-implement und gleichzeitig immutable nicht mehr so richtig wie auch dein Beispiel zeigt.
Was ich mich gerade frage: evt. ist es nur nicht explizit genug in der MSDN hervorgehoben, dass das beschriebene Vorgehen nur für Werttypen funktioniert? Es steht ja auch dort: "...for small classes or structs that just encapsulate a set of values..." - vielleicht ist ja mit 'values' auch wirklich das Wort Werttypen gemeint? Die Beispiele in der MSDN nutzen auch alle Werttypen mal abgesehen von String was aber laut MSDN schon per Gesetz immutable ist
Grüße,
Sebastian
P.S.: wir nehmen auto-Properties eigentlich immer nur für simple Datentypen und wie dein Beitrag zeigt ist das auch gut so
Erstellt von Sebastian Stricker um 08:13:58 PM am 02/14/2010 | - Website - |
ja "set of values (data)", glaube nicht, dass meine Beispielklasse mehr hat
Gruß JJR
P.S.: Aber warum benutzt Ihr Auto-Properties überhaupt bei "simplen Datentypen" ?
Erstellt von JakeJBlues um 08:34:25 PM am 02/14/2010 | - Website - |
Gruß,
Sebastian
Erstellt von Sebastian Stricker um 08:49:31 PM am 02/14/2010 | - Website - |
yep, aber warum ein Property, das ist die Frage
Obwohl, klar weil man sonst die "Object Intializer" nicht benutzen kann!
Gruß JJR
Erstellt von JakeJBlues um 08:57:51 PM am 02/14/2010 | - Website - |
muß mich korrigieren, für die Object Intializer braucht man die Auto-Implemented Properties nicht
Gruß JJR
namespace ObjectInitializer {
public class Test {
public string s1;
public string s2;
public int i1;
}
class Program {
static void Main(string[] args) {
Test t = new Test() {i1 = 1, s1 = "Test", s2 = "Test2"};
}
}
}
Erstellt von JakeJBlues um 09:53:02 AM am 02/15/2010 | - Website - |
Aber egal: AIP's are fun!
Grüße,
Sebastian
P.S.: AIP = auto-implemented property, hab ich jetzt mal so festgelegt
Erstellt von Sebastian Stricker um 08:28:19 PM am 02/16/2010 | - Website - |