Getter und Setter (II) oder Auto-Implemented Properties in "immutable Objects"
Category 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 ......
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
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 ...
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?








Comments
hier hast du wohl tatsächlich etwas zu viel von C# erwartet...
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
Posted by Sebastian Stricker At 08:13:58 PM On 14.02.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" ?
Posted by JakeJBlues At 08:34:25 PM On 14.02.2010 | - Website - |
Gruß,
Sebastian
Posted by Sebastian Stricker At 08:49:31 PM On 14.02.2010 | - Website - |
yep, aber warum ein Property, das ist die Frage
Obwohl, klar weil man sonst die "Object Intializer" nicht benutzen kann!
Gruß JJR
Posted by JakeJBlues At 08:57:51 PM On 14.02.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"};
}
}
}
Posted by JakeJBlues At 09:53:02 AM On 15.02.2010 | - Website - |
Aber egal: AIP's are fun!
Grüße,
Sebastian
P.S.: AIP = auto-implemented property, hab ich jetzt mal so festgelegt
Posted by Sebastian Stricker At 08:28:19 PM On 16.02.2010 | - Website - |