« Maschinenlesbares XML | Main| Vladimir Yaroslavskiy »

Getter und Setter (II) oder Auto-Implemented Properties in "immutable Objects"

8
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 ->

However, for small classes or structs that just encapsulate a set of values (data) and have little or no behaviors, it is recommended to make the objects immutable by declaring the set accessor as private.

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

Gravatar Image1 - Hallo Jörg,

hier hast du wohl tatsächlich etwas zu viel von C# erwartet... Emoticon 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 Emoticon

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 Emoticon

Gravatar Image2 - Hallo Sebastian,
ja "set of values (data)", glaube nicht, dass meine Beispielklasse mehr hat Emoticon

Gruß JJR
P.S.: Aber warum benutzt Ihr Auto-Properties überhaupt bei "simplen Datentypen" ?Emoticon

Gravatar Image3 - Die auto-Properties werden bei uns eigentlich nur eingesetzt um etwas weniger Schreibarbeit gegenüber dem herkömmlichen Property zu haben - ein anderer Grund fällt mir jetzt nicht ein... Emoticon

Gruß,
Sebastian

Gravatar Image4 - Hallo Sebastian,

yep, aber warum ein Property, das ist die Frage Emoticon

Obwohl, klar weil man sonst die "Object Intializer" nicht benutzen kann!

Gruß JJR

Gravatar Image5 - Hallo Sebastian,

muß mich korrigieren, für die Object Intializer braucht man die Auto-Implemented Properties nicht Emoticon

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"};

}
}
}

Gravatar Image6 - Also das einzige was mir jetzt noch einfällt ist, dass man wenn man wenigstens einen der Zugriffsoperatoren (neudeutsch: Accessor Emoticon) für die Variable einschränken möche, sich mit dem AIP etwas Schreibarbeit spart. Ich denke die haben das auch eingeführt, dass man eher dazu tendiert alles über Properties zu machen damit der Code etwas "einheitlicher" wird und die public-Variablen verschwinden... o.k., ist für mich jetzt dadurch trotzdem kein Must-Have und für dich sicher auch nicht Emoticon

Aber egal: AIP's are fun! Emoticon

Grüße,
Sebastian


P.S.: AIP = auto-implemented property, hab ich jetzt mal so festgelegt Emoticon

Mach einen Kommentar

:-D:-o:-p:-x:-(:-):-\:angry::cool::cry::emb::grin::huh::laugh::lips::rolleyes:;-)

Amazon


Impressum

Firmenname: Peanuts-Soft
Straße Nummer: Biinger Strasse 8
PLZ Ort: 55263 Wackernheim
Telefon: +491772134526
E-Mail: joerg.reck @ peanuts-soft.de
Disclaimer: Peanuts-Soft übernimmt keine Garantie dafür, dass die auf dieser Website bereitgestellten Informationen vollständig, richtig und stets aktuell sind. Dies gilt auch für alle Links, auf die verwiesen wird. Peanuts-Soft ist für die Inhalte, auf die per Link verwiesen wird, nicht verantwortlich. Peanuts-Soft haftet nicht für konkrete, mittelbare und unmittelbare Schäden oder Schäden, die durch fehlende Nutzungsmöglichkeiten, Datenverluste oder entgangene Gewinne – sei es aufgrund der Nichteinhaltung vertraglicher Verpflichtungen, durch Fahrlässigkeit oder eine andere unerlaubte Handlung – im Zusammenhang mit der Nutzung von Dokumenten oder Informationen bzw. der Erbringung von Dienstleistungen entstehen, die auf dieser Web Site zugänglich sind.
Datenschutz: Inhalt und Gestaltung der Internetseiten sind urheberrechtlich geschützt. Eine Vervielfältigung der Seiten oder deren Inhalte bedarf der vorherigen schriftlichen Zustimmung von Peanuts-Soft.


Locations of visitors to this page

Powered By

Domino BlogSphere
Version 3.0.2