This post originated from an RSS feed registered with .NET Buzz
by -.
Original Post: Kopier-Konstruktor in C#
Feed Title: Norbert Eder - Living .NET
Feed URL: http://feeds.feedburner.com/NorbertEder-Livingnet
Feed Description: Copyright (c)2005, 2006 by Norbert Eder
Unter vielen Sprachen ist ein Kopier-Konstruktor standardm����ig f��r ein Objekt vorhanden. Bei C# ist dem nicht so. Nachfolgend m��chte ich kurz zeigen, wie ein Kopier-Konstruktor in C# realisiert wird. Im Anschluss gibt es einen Hinweis von mir, warum ich pers��nlich Kopier-Konstruktoren nicht verwenden w��rde.
publicclass Car
{
privateint _maxSpeed = 200;
private Color _color = Color.White;
private Driver _driver = null;
publicint MaxSpeed
{
get { returnthis._maxSpeed; }
set { this._maxSpeed = value; }
}
public Color Color
{
get { returnthis._color; }
set { this._color = value; }
}
public Driver Driver
{
get { returnthis._driver; }
set { this._driver = value; }
}
public Car() { }
public Car(Car car)
{
this._color = car.Color;
this._maxSpeed = car.MaxSpeed;
Driver d = new Driver();
d.Firstname = car.Driver.Firstname;
d.Lastname = car.Driver.Lastname;
this._driver = d;
}
}
Es gibt eine ��berladung des Konstruktors, welche ein Objekt vom Typ Car entgegennimmt. Hierzu wird ein Deep Copy durchgef��hrt und die Daten entsprechend kopiert.
Dies klingt ja prinzipiell recht einfach und auch ganz gut. Was daran passt also nicht? Nun, man gehe von der Verwendung in einem Framework, welches anderen Entwicklern zur Verf��gung gestellt wird aus, oder davon, dass sich der eigentliche Entwickler einige Wochen sp��ter nochmals an dieses Projekt setzt. Hier sieht er beispielsweise folgenden Code:
Car c = new Car();
Driver d = new Driver();
d.Firstname = "Norbert";
d.Lastname = "Eder";
c.MaxSpeed = 250;
c.Color = Color.Blue;
c.Driver = d;
Car c2 = new Car(c);
Auf den ersten Blick ist nicht ersichtlich, dass die Daten aus dem Objekt in das neu zu erstellende Objekt kopiert werden. Hierzu ist ein Blick in die Klasse notwendig. Ein Schritt, der nicht sein muss. Stattdessen empfiehlt es sich, das Interface ICloneable zu verwenden, oder mit MemberwiseClone zu arbeiten. Je nachdem welche Kopiermethode verwendet werden soll.