Wie unüblich ist eine Kopie in C#?
-
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-1Ich 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-9Dieses 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
-
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 einRentable
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 diePayment
Dialoge direkt in dasPayments
Array, bzw. dessen Objekte, desRentable
Objekt geschrieben hätten. Die Veränderungen müssen irgendwo zwischengespeichert werden, bis das OK kommt, dass die Veränderungen in dasRentable
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).
-
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.
-
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 KaufobjekteGrüssli