Wie unüblich ist eine Kopie in C#?


  • Administrator

    Hallo zusammen,

    Die Frage steht eigentlich bereits im Titel. Also wie üblich ist es ein Objekt in C# über zum Beispiel ICloneable zu kopieren und zwar beide Arten, also tiefe und/oder flache Kopie.

    Vielleicht noch eine Frage am Rande:
    Könnt ihr ein gutes Buch empfehlen für Programmierrichtlinien und -beispielen in C#? Also, falls ihr das aus C++ kennt, etwas in Richtung von "Effective C++" oder "The C++ In Depth Series". Ich brauche Erfahrung ... 😉

    Grüssli



  • Das hängt kaum von der Sprache ab, sondern vom Anwendungsfall. Ich hab IClonable schon öfter implementiert. Es gibt auch Object.MemberwiseClone() , was einem viel Arbeit abnimmt.

    Bücher, die "Erfahrung" vermitteln kenne ich leider keine. Ich kann aber den Blog von einem der C#-Compiler-Entwickler von Microsoft empfehlen. Fabulous Adventures In Coding von Eric Lippert



  • Microsoft .NET Framework-Programmierung in C#. Expertenwissen zur CLR und dem .NET Framework 2.0
    http://www.amazon.de/Microsoft-NET-Framework-Programmierung-Expertenwissen-Framework/dp/3860639846/ref=sr_1_1?ie=UTF8&s=books-intl-de&qid=1248549231&sr=8-1

    Ich finde dieses Buch sehr lesenswert. Es vermittelt sehr viel Hintergrundwissen. (Ob allerdings die ICloneable Problematik besprochen wird, weiss ich nicht mehr..).

    Foundations of object-oriented programming using .net 2.0 patterns
    http://www.amazon.de/Foundations-object-oriented-programming-using-patterns/dp/1590595408/ref=sr_1_9?ie=UTF8&s=books-intl-de&qid=1248549524&sr=1-9

    Dieses Buch zeigt auf wie die Dinge "the C# Way" gemacht werden können.

    @Davere:
    Das nicht definiert ist wie das Objekt geklont wird eines der Probleme von ICloneable. Ev. kannst Du einfach zwei seperate Interfaces (eines für tiefe und eines für flache Kopie) erstellen und ICloneable nicht benutzen (oder falls notwendig einen Adapter bauen).

    Simon


  • Administrator

    Danke für die bisherigen Empfehlungen, werde die mal anschauen und dann entsprechend kaufen oder lesen 😉

    Zur Frage der Kopie:
    Durch das Fehlen einer expliziten Kopiersemantik kommt es mir manchmal ein wenig seltsam vor, wenn ich in C# Objekte kopiere. Ich hatte das gleiche Problem bereits mit Java. Man hat das Gefühl, dass man jedesmal, wenn man eine Kopie erstellt, einen Fehler im Design hatte, weil die Sprache irgendwie nichts sinnvolles in der Richtung anbietet.

    Aber zum Teil wüsste ich echt nicht, wie ich um eine Kopie herumkommen könnte. Mal eines der Probleme als Beispiel, vielleicht könnt ihr mir da gleich mehr sagen:

    public abstract class Rentable
    {
      // ...
      public Payment[] Payments { get; private set; }
      // Wird dann im Konstruktor auf die richtige Länge initialisiert.
      // ...
    }
    

    Nun hatte ich zwei Windows.Forms Dialoge. Der erste hat ein Rentable entgegengenommen und die entsprechenden Informationen dargestellt, auch die Zahlungen. In diesem Dialog konnte man nun für jede Zahlung einen zusätzlichen Dialog starten. Bei beiden Dialogen gab es ein Abbrechen Button.

    Würde ich keine Kopie vom Array machen, könnte ich nicht alle Änderungen rückgängig machen, wenn auf den Abbrechen Button des Rentable Dialogs gedrückt wurde, da die Payment Dialoge direkt in das Payments Array, bzw. dessen Objekte, des Rentable Objekt geschrieben hätten. Die Veränderungen müssen irgendwo zwischengespeichert werden, bis das OK kommt, dass die Veränderungen in das Rentable Objekt geschrieben werden dürfen.

    Grüssli



  • @Dravere: Was meinste mit expliziter Kopiersemantik? Fals damit die Kopierctor und die impliziten/expliziten Kopieroperatoren gemeint sind, die gibt es sehr wohl in C#. Fals nicht dann klär mich kurz auf.



  • Das Kopieren überlässt die Sprache Dir. Das was Du da hast ist ein Problem, dass mit dem "Unit of Work"-Pattern gelöst werden kann. Kopieren musst Du allerdings auch bzw. wird angenommen, dass die Daten aus einer Datenbank kommen. Persistenzframeworks wie NHibernate können das Pattern von Haus aus (Sessions).


  • Administrator

    Firefighter schrieb:

    @Dravere: Was meinste mit expliziter Kopiersemantik? Fals damit die Kopierctor und die impliziten/expliziten Kopieroperatoren gemeint sind, die gibt es sehr wohl in C#. Fals nicht dann klär mich kurz auf.

    Ich meine damit die simple Tatsache, dass bei einer Zuweisung eines Referenztyps keine Kopie geschieht, sondern einfach nur eine Referenzzuweisung, also ähnlich einer Zeigerzuweisung in C++. Wenn ich einen Referenztyp kopieren will, dann geht das in C# nur über zwei Möglichkeiten, zumindest habe ich nur die bisher herausgefunden und die sind nicht immer gegeben:

    // 1.
    MyClass newObj = new MyClass(oldObj);
    
    // Führt aber oft nur eine flache Kopie aus, zum Beispiel bei Collections.
    
    // 2.
    MyClass newObj = (MyClass)oldObj.Clone();
    
    // Scheint sich ganz unterschiedlich zu verhalten, ob flache oder tiefe Kopie.
    

    Es fehlt mir einen expliziten Operator, ein explizites Vorgehen, etwas standardmässiges. Die meistens bisherigen Artikel oder auch Bücher, welche ich bis jetzt gelesen habe, haben sich meistens nicht mit Kopien beschäftigt. Daher kommt es mir erst recht so vor, als wäre dies etwas, was man in C# vermeiden sollte. Was ich aber irgendwie als verwirrend empfinde.

    hajb schrieb:

    Das was Du da hast ist ein Problem, dass mit dem "Unit of Work"-Pattern gelöst werden kann.

    Hast du da irgendwelche Materialen dazu? Konnte auf Wikipedia nichts finden und auch mit meiner Lieblingssuchmaschine ergab es keine sinnvollen Treffer.

    hajb schrieb:

    Kopieren musst Du allerdings auch bzw. wird angenommen, dass die Daten aus einer Datenbank kommen. Persistenzframeworks wie NHibernate können das Pattern von Haus aus (Sessions).

    Die Daten kommen aber aus keiner Datenbank. Eine Datenbank wäre bei diesem Projekt völlig überdimensioniert. Es hat viel zu wenig Daten 😉

    Grüssli



  • Vllt. findest Du ja hier ein paar Ideen dazu:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-246441.html

    Also, falls ihr das aus C++ kennt, etwas in Richtung von "Effective C++" oder "The C++ In Depth Series"

    Eventuell

    Effective C# | ISBN: 9780321245663 More Effective C# | ISBN: 9780321485892



  • Dravere schrieb:

    hajb schrieb:

    Das was Du da hast ist ein Problem, dass mit dem "Unit of Work"-Pattern gelöst werden kann.

    Hast du da irgendwelche Materialen dazu? Konnte auf Wikipedia nichts finden und auch mit meiner Lieblingssuchmaschine ergab es keine sinnvollen Treffer.

    Du solltest Deine Suchmaschine welchseln: Google: "Unit of Work"
    Auf der ersten Seite gibt es gleich mehrere Treffer, der aus der MSDN sieht gut aus.

    Dravere schrieb:

    hajb schrieb:

    Kopieren musst Du allerdings auch bzw. wird angenommen, dass die Daten aus einer Datenbank kommen. Persistenzframeworks wie NHibernate können das Pattern von Haus aus (Sessions).

    Die Daten kommen aber aus keiner Datenbank. Eine Datenbank wäre bei diesem Projekt völlig überdimensioniert. Es hat viel zu wenig Daten 😉

    Vielleicht kannst Du dem Pattern dennoch konzeptionell etwas abgewinnen. Schau halt mal.


  • Administrator

    Knuddlbaer schrieb:

    Vllt. findest Du ja hier ein paar Ideen dazu:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-246441.html

    Bin ich bereits am Mitlesen. Sehr viel hat es mir allerdings noch nicht gebracht, um meine Verwirrung über die Kopie in C# zu beheben. Dafür allerdings ein paar andere interessante Dinge gelernt 🙂

    Knuddlbaer schrieb:

    Eventuell

    Effective C# | ISBN: 9780321245663 More Effective C# | ISBN: 9780321485892

    Yay! Wer kommt schon auf eine so simple Idee und der Herausgeber ist sogar Scott Meyers, es ist nur ein anderer Autor.
    Die kommen definitiv auf die Liste der Kaufobjekte 😉

    Grüssli


Anmelden zum Antworten