Archive for November, 2009

Eigene ObservableCollection

In meinem aktuellen Projekt des ArmyGen arbeite ich viel mit ObserveableCollections, da ich viele Abläufe und Änderungen überwachen muss und ggf. andere Objekte davon informiert werden müssen. Eine sehr schicke Sache die Microsoft da mit dem .NET 3.0 eingeführt hat. Jedes mal wird man automatisch benachrichtigt, wenn einer Collection ein Element hinzugefügt, entfernt, bewegt, ersetzt oder sogar die ganze Collection gecleared wird.

Das schöne ist auch, dass in den Eventargs beim hinzufügen und entfernen von Elementen gesagt wird welche Elemente genau behandelt wurden. Einen Haken jedoch gibt es trotzdem. Beim Clear() der Collection wird in den Eventargs keine Angabe darüber gemacht welche Elemente alle verschwunden sind. Wie ich finde eine sehr ärgerliche Sache denn ich nutze oft Clear().

Microsoft wird wohl Gründe für die Entscheidung gehabt haben (vermutlich aus Performance-/Speichergründen), jedoch ist es für mich ein wichtiges Feature auch bei einem Clear() zu erfahren was vorher in der Liste gesteckt hat. Darum habe ich ich meine eigene ObserveableCollection entworfen, bzw. die bestehende modifiziert.

Desweiteren habe ich bei der .NET ObservableCollection eine AddRange() Methode vermisst welche ich ebenfalls in meiner Collection mit eingebaut habe.

Update : Ich habe ganz vergessen eine RemoveRange(IEnumerable) Methode mit einzubauen. Diese habe ich grade noch nachträglich mit eingebaut !

Meine : tww.Util.Collections.ObservableCollection

Do’s and Don’ts #2 Clone()

do's don'tsIn diesem zweiten Beitrag zum Thema “Do’s and Don’ts” möchte ich ein Szenario ansprechen, welches mich erst vor kurzem in meinem ArmyGen Projekt beschäftigt hat. Es geht um das “Klonen” von Objekten. Das .NET Framework bietet nur ein Interface, welches sich “IConeable” nennt, an um das Klonen von Objekten einzubinden. Unglücklicherweise besagt die einzige Methode in diesem Interface (“Clone()“) nicht um welche Art des Klonens es sich dabei handelt.

Man unterscheidet nämlich zwischen dem “DeepClone” und dem “ShallowClone”. Beim Deepclone soll eine Kopie des Objektes entstehen und hinzu sollen alle referenzierten Objekte in diesem Objekt ebenfalls rekursiv kopiert werden. Beim ShallowClone hingegen soll lediglich ein Teil des Objektes kopiert werden und der Rest sollen vorhandene Referenzen sein. Also :

DON’T !

public MyClass : ICloneable
{
    public void Clone()
    {
        //logik
    }
}

Read the rest of this entry »