<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Jochens Weblog</title>
        <link>http://blogs.escde.net/jochen/Default.aspx</link>
        <description>ESCde Developer Blog</description>
        <language>en-US</language>
        <copyright>Jochen</copyright>
        <managingEditor>schimmel@escde.net</managingEditor>
        <generator>Subtext Version 1.9.3.0</generator>
        <image>
            <title>Jochens Weblog</title>
            <url>http://blogs.escde.net/images/RSS2Image.gif</url>
            <link>http://blogs.escde.net/jochen/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>Detailierte Informationen zum Team Foundation Server</title>
            <link>http://blogs.escde.net/jochen/archive/2007/10/01/88.aspx</link>
            <description>&lt;p&gt;Sie suchen detailierte Informationen zum TFS? Dann sollten Sie mal unter &lt;/p&gt; &lt;p&gt;&lt;a href="http://www.codeplex.com/TFSGuide"&gt;http://www.codeplex.com/TFSGuide&lt;/a&gt; nachsehen...&lt;/p&gt;&lt;img src="http://blogs.escde.net/jochen/aggbug/88.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jochen</dc:creator>
            <guid>http://blogs.escde.net/jochen/archive/2007/10/01/88.aspx</guid>
            <pubDate>Mon, 01 Oct 2007 09:17:34 GMT</pubDate>
            <wfw:comment>http://blogs.escde.net/jochen/comments/88.aspx</wfw:comment>
            <comments>http://blogs.escde.net/jochen/archive/2007/10/01/88.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.escde.net/jochen/comments/commentRss/88.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.escde.net/jochen/services/trackbacks/88.aspx</trackback:ping>
        </item>
        <item>
            <title>Absolute Dateipfade erzeugen</title>
            <link>http://blogs.escde.net/jochen/archive/2007/10/01/87.aspx</link>
            <description>&lt;p&gt;Sie haben in einer Variablen einen Verzeichnispfad, in einer anderen einen Dateinamen. Ziel: Den exakten Pfad zur Datei erzeugen. Das Problem hierbei ist, dass man in solchen Fällen zumeist umständlich prüfen muss, ob der Verzeichnispfad mit einem '\' aufhört oder nicht. Vergisst man die Problematik komplett, führt dies zwangsläufig zu Fehlern. Denkt man daran, entsteht häufig sehr unschöner Code. &lt;/p&gt; &lt;p&gt;Doch das .NET Framework kann hierbei helfen: Mittels der statischen Methode &lt;em&gt;System.IO.Path.Combine()&lt;/em&gt; lässt sich dieser Test (sowie das einfügen eines '\', falls nötig) mit nur einem Aufruf erledigen:&lt;/p&gt; &lt;p&gt;string strPath = "C:\\MyFolder"&lt;br /&gt;string strFileName = "MyFile.txt"&lt;br /&gt;string strComplete = System.IO.Path.Combine(strPath, strFileName);&lt;/p&gt;&lt;img src="http://blogs.escde.net/jochen/aggbug/87.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jochen</dc:creator>
            <guid>http://blogs.escde.net/jochen/archive/2007/10/01/87.aspx</guid>
            <pubDate>Mon, 01 Oct 2007 08:39:21 GMT</pubDate>
            <wfw:comment>http://blogs.escde.net/jochen/comments/87.aspx</wfw:comment>
            <comments>http://blogs.escde.net/jochen/archive/2007/10/01/87.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.escde.net/jochen/comments/commentRss/87.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.escde.net/jochen/services/trackbacks/87.aspx</trackback:ping>
        </item>
        <item>
            <title>Heap oder Stack?</title>
            <link>http://blogs.escde.net/jochen/archive/2007/06/13/79.aspx</link>
            <description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;Als erprobter C#-Entwickler kennt man natürlich das Konzept des Boxing/Unboxing: Struct-Instanzen liegen üblicherweise auf dem Stack. Möchte man allerdings  &lt;/p&gt;&lt;p&gt;Methoden auf diesen Instanzen ausführen (Beispielsweise die "ToString()"-Methode), so muss man das Struct zunächst in einen Referenztyp verwandeln: Die  &lt;/p&gt;&lt;p&gt;Struct-Instanz wird auf den Heap verschoben und es wird auf dem Stack eine Referenz darauf angelegt. Beispielsweise so:  &lt;/p&gt;&lt;p&gt;struct MyStruct {}  &lt;/p&gt;&lt;p&gt;MyStruct ms; // Instanz von MyStruct auf dem Stack erstellen&lt;br /&gt;object obj = (object) ms; // ms wird auf den Heap kopiert, obj verweist auf dieses Objektms.ToString();&lt;br /&gt;// nun kann ToString() aufgerufen werden  &lt;/p&gt;&lt;p&gt;Soweit nichts neues. Allerdings gibt es auch Situationen, in denen das Geschehen nicht so offensichlich ist wie hier. Betrachten Sie die folgenden  &lt;/p&gt;&lt;p&gt;CodeZeilen:  &lt;/p&gt;&lt;p&gt;struct MyStruct&lt;br /&gt;{&lt;br /&gt;    private int i;&lt;br /&gt;    public void SetI(int x) { i = x; };&lt;br /&gt;}  &lt;/p&gt;&lt;p&gt;public static void Main()&lt;br /&gt;{&lt;br /&gt;    MyStruct ms;&lt;br /&gt;    ms.SetI(1);&lt;br /&gt;    object obj = (object) ms;&lt;br /&gt;    ((MyStruct)obj).SetI(5); // [1]&lt;br /&gt;}  &lt;/p&gt;&lt;p&gt;In diesem Codeausschnitt wird ein Element vom Typ MyStruct erzeugt, welches einen privaten Integer sowie eine öffentliche Methode hat, um diesen zu setzen.  &lt;/p&gt;&lt;p&gt;In der Main-Methode wird dieser zuerst auf den Wert 1 gesetzt, anschließend wird das Objekt auf den Heap geboxt. Interessant wird es in der mit [1]  &lt;/p&gt;&lt;p&gt;markierten Zeile: Hier konvertieren wir obj nach MyStruct, um anschließend mittels SetI() den Wert des structs zu ändern. Auf den ersten Blick wirkt es so,  &lt;/p&gt;&lt;p&gt;als würde die Objektreferenz obj in eine MyStruct-Referenz konvertiert und SetI(8) somit auf dem Objekt auf dem Heap ausgeführt. Aber weit gefehlt: Da  &lt;/p&gt;&lt;p&gt;MyStruct nach wie vor ein Wertetyp ist (und eben kein Referenz-Typ) wird in dieser Situation Unboxing durchgeführt: Das von obj referenzierte Objekt wird  &lt;/p&gt;&lt;p&gt;zurück auf den Stack kopiert und SetI auf dieses Element durchgeführt. Anschließend wird dieses Objekt wieder gelöscht (da wir den Wert nicht in einer  &lt;/p&gt;&lt;p&gt;Variablen abspeichern). Die auf dem Heap liegende MyStruct-Instanz, auf die obj verweist, hat also auch nach dem SetI(8)-Aufruf noch den Wert 1 in i  &lt;/p&gt;&lt;p&gt;gespeichert.  &lt;/p&gt;&lt;p&gt;Quintessenz des Ganzen ist, dass structs, die auf den Heap geboxt wurden nicht veränderbar sind. Bei einer Konversion in einen Struct-Datentyp wird immer  &lt;/p&gt;&lt;p&gt;unboxing aufgerufen, die Objekte auf dem Heap werden hierbei nicht angerührt, auch dann nicht, wenn die Syntax zunächst anderes vermuten lässt.  &lt;/p&gt;&lt;p&gt;Aber Vorsicht: eine Variante gibt es doch noch, um Struct-Elemente auf dem Heap zu bearbeiten: Interfaces. Betrachten Sie die folgende Variante des obigen  &lt;/p&gt;&lt;p&gt;Codes:  &lt;/p&gt;&lt;p&gt;Interface I { void SetI(int x); }  &lt;/p&gt;&lt;p&gt;struct MyStruct : I&lt;br /&gt;{&lt;br /&gt;    private int i;&lt;br /&gt;    public void SetI(int x) { i = x; };&lt;br /&gt;}  &lt;/p&gt;&lt;p&gt;public static void Main()&lt;br /&gt;{&lt;br /&gt;    MyStruct ms;&lt;br /&gt;    ms.SetI(1);&lt;br /&gt;    Object obj = (object) ms;&lt;br /&gt;    ((I)obj).SetI(5); // [2]&lt;br /&gt;}  &lt;/p&gt;&lt;p&gt;Nun wird die SetI()-Methode von einem Interface angeboten. MyStruct implementiert dieses Interface. Wen wir nun wie in Zeile [2] unsere Objekt-Referenz nicht  &lt;/p&gt;&lt;p&gt;nach MyStruct sondern nach I konvertieren, so "trifft" unser SetI(5)-Aufruf wirklich das Objekt auf dem Heap, ohne eine Kopie zu erstellen. Dies liegt daran,  &lt;/p&gt;&lt;p&gt;dass Interfaces immer Referenztypen sind. Daher kommt der Cast von Object nach Interface auch ohne Unboxing aus.&lt;/p&gt;&lt;img src="http://blogs.escde.net/jochen/aggbug/79.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jochen</dc:creator>
            <guid>http://blogs.escde.net/jochen/archive/2007/06/13/79.aspx</guid>
            <pubDate>Wed, 13 Jun 2007 08:44:25 GMT</pubDate>
            <wfw:comment>http://blogs.escde.net/jochen/comments/79.aspx</wfw:comment>
            <comments>http://blogs.escde.net/jochen/archive/2007/06/13/79.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.escde.net/jochen/comments/commentRss/79.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.escde.net/jochen/services/trackbacks/79.aspx</trackback:ping>
        </item>
        <item>
            <title>Weak References - Schwache Referenzen</title>
            <link>http://blogs.escde.net/jochen/archive/2007/04/25/76.aspx</link>
            <description>&lt;p&gt;Das grundlegende Konzept der Referenz unter .NET sollte jedem klar sein: Eine Referenz identifiziert ein Objekt, ohne gleichzeitig die exakte Speicheradresse des Objektes zu bezeichnen. Solange der Entwickler eine Referenz auf ein Objekt hat, ist gewährleistet, dass dieses nicht vom Garbage Collector "zerstört" wird. Sobald der Entwickler die letzte Referenz eines Objektes auf "null" setzt, ist das Objekt unereichbar und darf vom Garbage Collector abgebaut werden. Diese Referenzen nennt man auch "starke Referenzen" ("strong reference"). &lt;/p&gt; &lt;p&gt;Im Unterschied hierzu gibt es allerdings auch "schwache" Referenzen ("weak references"). Bei diesen hat der Entwickler noch eine Referenz auf sein Objekt, allerdings kann der Garbage Collector das Objekt trotzdem zerstören. Zunächst hört sich dieses Konzept völlig sinnfrei an, allerdings gibt es Situationen, in denen schwache Referenzen sehr hilfreich sein können: Stellen Sie sich vor, Sie schreiben eine Anwendung, die aus zwei relativ unabhängigen Bereichen besteht. Zunächst arbeitet der Anwender in Bereich A, wo sich sehr viele, große Objekte ansammeln, beispielsweise eine Liste aller Dateien des Rechners. Nun wechselt der Anwender in Bereich B. Ob er wieder in Teil A zurückkehrt, ist ungewiss. Falls der Garbage Collector nun Speicher frei machen muss, sollte er also prinzipiell unsere Dateiliste aus Teil A löschen können. Wenn wir hierzu unsere Referenzen alle auf "null" setzen, ermöglichen wir dem Garbage Collector diese Option. kehrt der User allerdings in Bereich A zurück (und der GC musste zuvor nicht aktiv werden), würde unsere Liste im Speicher zwar noch existieren, allerdings müssten wir sie neu aufbauen, da wir keine Referenz mehr haben. Genau für solche Fälle sind die schwachen Referenzen.&lt;/p&gt; &lt;p&gt;Und nun wollen wir uns mal ansehen, wie man solch eine schwache Referenz einsetzt:&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:ed58aba6-d7db-49f5-b3ad-16f9cbf01cfc" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; System;
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; System.Collections.Generic;
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; System.Text;

&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;namespace&lt;/span&gt;&lt;span style="color: #000000; "&gt; ConsoleApplication5
{
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;class&lt;/span&gt;&lt;span style="color: #000000; "&gt; Program
    {
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;class&lt;/span&gt;&lt;span style="color: #000000; "&gt; BigChunk { }

        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;static&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; Main(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt;[] args)
        {
            &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; das große Objekt&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;            BigChunk bc &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; BigChunk();

            &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; schwache Referenz auf das Objekt erzeugen, starke Referenz freigeben&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;            System.WeakReference wr &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; WeakReference(bc);
            bc &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;null&lt;/span&gt;&lt;span style="color: #000000; "&gt;;

            &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; starke Referenz aus schwacher wiederherstellen:&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;            BigChunk bc2 &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; (BigChunk) wr.Target;
            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;if&lt;/span&gt;&lt;span style="color: #000000; "&gt; (bc2 &lt;/span&gt;&lt;span style="color: #000000; "&gt;==&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;null&lt;/span&gt;&lt;span style="color: #000000; "&gt;)
            {
                &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; der Garbage Collector war schneller...&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;                bc2 &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; BigChunk();
            }
        }
    }
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Das Erzeugen einer schwachen Referenz ist sehr einfach, man muss lediglich eine starke Referenz auf das betroffene Objekt als Konstruktionsparameter übergeben. Allerdings muss man aufpassen, dass man auch auf jeden Fall die starke Referenz (beziehungsweise alle vorhandenen) auf null setzt. Sonst ist das Objekt trotz der erzeugten schwachen Referenz für den Garbage Collector unerreichbar. &lt;/p&gt;
&lt;p&gt;Möchte man später wieder mit dem Objekt arbeiten, weißt man einfach die Target-Eigenschaft der schwachen Referenz einer starken Referenz zu. Hierbei muss man allerdings auf den Cast achten! Anschließend muss man die starke Referenz noch auf null hin überprüfen. Zeigt die Referenz auf null, so hat der Garbage Collector das Objekt in der Zwischenzeit gelöscht und man muss es erneut erzeugen. &lt;/p&gt;
&lt;p&gt;Abschließend bleibt noch zu sagen, dass man schwache Referenzen nur dann einsetzen sollte, wenn sich in den betroffenen Objekten keine Daten befinden, die man nicht selbst wiederherstellen kann. Schwache Referenzen bieten also einen Ansatz zur besseren Ausnutzung des Speichers und einer schöneren Zusammenarbeit mit dem Garbage Collector. Allerdings sollten sie immer wohlbedacht angewendet werden!&lt;/p&gt;&lt;img src="http://blogs.escde.net/jochen/aggbug/76.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jochen</dc:creator>
            <guid>http://blogs.escde.net/jochen/archive/2007/04/25/76.aspx</guid>
            <pubDate>Wed, 25 Apr 2007 10:50:29 GMT</pubDate>
            <wfw:comment>http://blogs.escde.net/jochen/comments/76.aspx</wfw:comment>
            <comments>http://blogs.escde.net/jochen/archive/2007/04/25/76.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.escde.net/jochen/comments/commentRss/76.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.escde.net/jochen/services/trackbacks/76.aspx</trackback:ping>
        </item>
        <item>
            <title>C#: is vs. as</title>
            <link>http://blogs.escde.net/jochen/archive/2007/04/02/71.aspx</link>
            <description>&lt;p&gt;Die beiden Schlüsselwörter is und as sollte jeder C#-Programmierer kennen: Mit is kann geprüft werden, ob ein Objekt Instanz eines bestimmten Typs ist. Das Ergebnis dieses Aufrufs ist ein Boolean:&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:0487333a-3149-412c-840d-5724e5e25932" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; width: 168px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;if&lt;/span&gt;&lt;span style="color: #000000; "&gt; (a &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;is&lt;/span&gt;&lt;span style="color: #000000; "&gt; B)
{
    B b &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; (B)a;
    &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; b verwenden...&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In diesem Beispiel gehe ich davon aus, dass B eine von A abgeleitete Klasse ist. Die Verwendung ist nun recht offensichtlich. Alternativ kann man auch das as-Schlüsselwort verwenden. as gibt sofort das gecastete Objekt zurück, beziehungsweise null, falls der cast nicht durchgeführt werden kann.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:449231b5-498d-4828-83a8-9cc55d8a39d5" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #000000; "&gt;B b &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; a &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;as&lt;/span&gt;&lt;span style="color: #000000; "&gt; B;
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;if&lt;/span&gt;&lt;span style="color: #000000; "&gt; (b &lt;/span&gt;&lt;span style="color: #000000; "&gt;!=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;null&lt;/span&gt;&lt;span style="color: #000000; "&gt;)
{
    &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; b verwenden&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Beide Varianten sehen recht schön aus und gehen schnell von der Hand. Nun stellt sich natürlich die Frage, welche Variante man (üblicherweise) verwenden sollte. Zunächst drängt sich natürlich ein Geschwindigkeitsvergleich auf. Man sollte annehmen, dass dieser Code vom Compiler in identischer Art und Weise übersetzt wird, da (oberflächlich betrachtet) ja eigentlich das Gleiche passiert. Aber weit gefehlt: Der entstehende IL-Code sieht nicht nur unterschiedlich aus, sondern es gibt auch einen klaren Gewinner bezüglich der Ausführungsgeschwindigkeit: as.&lt;/p&gt;
&lt;p&gt;Die Begründung hierfür ist recht einfach: In der ersten Variante muss die Runtime beim is Befehl prüfen, ob es sich bei a um ein B-Objekt handelt. Dieser Aufwand ist nahezu identisch mit einem cast. Anschließend wird innerhalb des if-Blocks erneut gecastet. Beim as Befehl selbst wird ebenfalls ein "cast-artiger" Test durchgeführt. Im if-Block allerdings nicht. Daher muss bei der as Variante nur einmal der Typ geprüft werden, bei is zweimal. Der null-Test bei as ist so schnell, dass er kaum ins Gewicht fällt. Testet man dies mit der Stopwatch mal durch,  so sieht man dass as tatsächlich die besseren Ergebnisse liefert. Allerdings sind beide Operatoren sehr schnell, so dass man für alltägliche Anwendungen völlig bedenkenlos is verwenden kann. In einer Performance-kritischen Anwendung, beispielsweise in einem XNA-Projekt, kann ein konsequentes beachten solcher Details sich in der Summe schon lohnen. &lt;/p&gt;
&lt;p&gt;Betrachtet man den IL-Code, so sieht man auch schon, dass der is-Code ein wenig länger ist. DIe kritische Anweisung ist hierbei der castclass IL-Befehl, der genau dem cast in der if-Abfrage entspricht und den Performance-Unterschied ausmacht.&lt;/p&gt;&lt;img src="http://blogs.escde.net/jochen/aggbug/71.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jochen</dc:creator>
            <guid>http://blogs.escde.net/jochen/archive/2007/04/02/71.aspx</guid>
            <pubDate>Mon, 02 Apr 2007 09:25:32 GMT</pubDate>
            <wfw:comment>http://blogs.escde.net/jochen/comments/71.aspx</wfw:comment>
            <comments>http://blogs.escde.net/jochen/archive/2007/04/02/71.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.escde.net/jochen/comments/commentRss/71.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.escde.net/jochen/services/trackbacks/71.aspx</trackback:ping>
        </item>
        <item>
            <title>Performante Schleifen kn&amp;uuml;pfen</title>
            <link>http://blogs.escde.net/jochen/archive/2007/03/06/70.aspx</link>
            <description>&lt;p&gt;Haben Sie sich schon mal Gedanken darüber gemacht, ob eine foreach-Schleife schneller als eine For-Schleife ist? Zugegeben, in den meisten Windows Forms-Anwendungen spielt dies kaum eine Rolle, da die Anzahl der Schleifendurchläufe einfach zu gering ist, als dass ein Unterschied überhaupt auffallen würde. Allerdings gibt es auch Situationen, in denen solche kleinen Optimierungen in der Summe dann wieder relevant werden können, beispielsweise bei der Spieleentwicklung unter XNA oder bei Anwendungen, die mit komplexen, Schleifen-intensiven Algorithmen große Datenmengen durchkauen ("Number-Crunching"). &lt;/p&gt; &lt;p&gt;Vergleichen Sie die beiden folgenden Schleifen: &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:57df3c0a-dcf9-43a4-aa7b-5e5234af12b5" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;foreach&lt;/span&gt;&lt;span style="color: #000000; "&gt; (&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; i &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;in&lt;/span&gt;&lt;span style="color: #000000; "&gt; int_list)
{
   DoSomething(i);
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:d17dbb78-dad9-4c86-8ecc-922ffca994d4" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;for&lt;/span&gt;&lt;span style="color: #000000; "&gt; (&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; i &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;; i &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; int_list.Count; i&lt;/span&gt;&lt;span style="color: #000000; "&gt;++&lt;/span&gt;&lt;span style="color: #000000; "&gt;)
{
   DoSomething(int_list[i]);
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Diese beiden Schleifen machen semantisch exakt das gleiche, allerdings passiert bei der foreach-Schleife intern deutlich mehr. Implementieren Sie einfach mal das generische Interface IEnumerable, dann sehen Sie sofort den Unterschied. &lt;/p&gt;
&lt;p&gt;Je nach Anzahl der Schleifendurchläufe (und natürlich auch abhängig von den Operationen in der Schleife) schwankt der Performance-Unterschied deutlich, allerdings lässt sich festhalten, dass eine for-Schleife gegenüber foreach eigentlich immer die Nase vorn hat. Das heißt natürlich nicht, dass foreach nicht nützlich wäre: foreach geht sehr leicht von der Hand und kann komplexe Schleifenkonstrukte sehr schön darstellen. Wenn allerdings Performance das ausschlaggebende Kriterium ist, lässt sich mit for ein Quentchen mehr Leistung aus dem Rechner pressen. &lt;/p&gt;
&lt;p&gt;Aber es geht noch besser: selbst die soeben hochgelobte for-Schleife lässt sich noch ein wenig "tieferlegen". Sehen Sie sich die folgende Schleife an:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:7035ef3d-78b0-4c63-9fd7-2bf7b41a4ce6" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; len &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; int_list.Count;
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;for&lt;/span&gt;&lt;span style="color: #000000; "&gt; (&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; i &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;; i &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; len; i&lt;/span&gt;&lt;span style="color: #000000; "&gt;++&lt;/span&gt;&lt;span style="color: #000000; "&gt;)
{
    DoSomething(li[i]);
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Diese for-Schleife spart gegenüber der Version weiter oben wieder ein paar Taktzyklen ein. Wieso? Properties scheinen auf den ersten Blick einfach nur eine Variable auszulesen. In Wahrheit versteckt sich hinter ihnen allerdings ein Methodenaufruf. Also ein Sprung, ablegen einer Rücksprungadresse auf den Stack, etc, alles nicht so schlimm, aber bei seeehr vielen Schleifendurchläufen irgendwann spürbar. Deshalb sparen wir uns die ständige Springerei und speichern die (sich nicht verändernde) Anzahl der zu iterierenden Listenelemente in einer Variablen. Noch schneller geht's wohl nur in Assembler...&lt;/p&gt;&lt;img src="http://blogs.escde.net/jochen/aggbug/70.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jochen</dc:creator>
            <guid>http://blogs.escde.net/jochen/archive/2007/03/06/70.aspx</guid>
            <pubDate>Tue, 06 Mar 2007 14:23:09 GMT</pubDate>
            <wfw:comment>http://blogs.escde.net/jochen/comments/70.aspx</wfw:comment>
            <comments>http://blogs.escde.net/jochen/archive/2007/03/06/70.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.escde.net/jochen/comments/commentRss/70.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.escde.net/jochen/services/trackbacks/70.aspx</trackback:ping>
        </item>
        <item>
            <title>Generics vs Vererbung</title>
            <link>http://blogs.escde.net/jochen/archive/2007/02/21/60.aspx</link>
            <description>&lt;p&gt;Generics sind eine sehr hübsche und unglaublich nützliche Angelegenheit. Allerdings gibt es hierbei auch manche Dinge, die nicht wirklich Intuitiv gelöst sind. Ein kleines Beispiel:&lt;/p&gt; &lt;p&gt;Sie haben eine Klasse A, von der zwei Klassen B und C erben. Da Sie sowohl viele B als auch viele C Objekte benötigen, benutzen Sie 2 Listen:&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:cb510495-e412-4d84-be61-db484ebf69cd" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #000000; "&gt;    List&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;B&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; list_b &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; List&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;B&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;();
    List&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;C&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; list_c &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; List&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;C&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Angenommen, Sie möchten nun eine Methode schreiben, die auf Mengen von A Objekten operiert. Was liegt näher als eine Funktion wie folgt zu deklarieren:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:cedc050b-327e-4f3f-ad38-180c5eee040d" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #000000; "&gt;  &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; MyMethod(List&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;A&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; list_a)
  {
     &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;foreach&lt;/span&gt;&lt;span style="color: #000000; "&gt; (A a &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;in&lt;/span&gt;&lt;span style="color: #000000; "&gt; list_a)
     {
         Do_Something_Important(a);
     }
  }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Nun sollten die beiden folgenden Aufrufe doch eigentlich ordnungsgemäß ihren Dienst verrichten:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:ebf695f7-57e3-404f-a4b3-a6605ea065eb" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #000000; "&gt;  MyMethod(list_b);
  MyMethod(list_c);&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Leider bekommen Sie hier bereits beim Kompilieren eine Fehlermeldung. Die Typen List&amp;lt;A&amp;gt; und List&amp;lt;B&amp;gt; sind nicht kompatibel. Obwohl sich eine Vererbungshierarchie zwischen beiden Mengen logisch geradezu aufdrängt, gibt es keine. Die beiden Typen haben rein gar nichts gemeinsam. Sollte man deshalb also genötigt sein, Code doppelt zu schreiben? Je eine Methode MyMethod für List&amp;lt;B&amp;gt; und List&amp;lt;C&amp;gt;? Wenn Ihre Vererbungshierarchie etwas komplexer ist, wird das Problem gar noch schlimmer. Aber es gibt eine Lösung, auch ohne exzessives Quellcode-Copy-And-Paste: Bekämpfen Sie Generics mit Generics:&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:9f3cdaed-8387-4672-8d2d-e19c5c801254" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;static&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; MyMethod&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;type&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;(List&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;type&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; list_t)
  &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;where&lt;/span&gt;&lt;span style="color: #000000; "&gt; type : A
{
  &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;foreach&lt;/span&gt;&lt;span style="color: #000000; "&gt; (A a &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;in&lt;/span&gt;&lt;span style="color: #000000; "&gt; list_t)
  {
    Do_Something_Important(a);
  }
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Diese Methode ist nun selbst generisch. Sie übernimmt einen Typ-Parameter (type) und erwartet als Argument eine Liste mit Elementen vom Typ type. Allerdings schränken wir den Typparameter insoweit ein, dass er von der Klasse A erben muss. Somit können wir in der Funktion ohne hässliche Casts oder Ähnliches auf die Elemente der Liste zugreifen und unsere beiden Methodenaufrufe von oben (mit list_b und list_c als Parameter) werden erfolgreich durchgeführt. Der Trick hierbei ist, dass für jeden Parametertyp (List&amp;lt;B&amp;gt; und List&amp;lt;C&amp;gt;) vom Compiler eine eigene Version von MyMethod&amp;lt;type&amp;gt; angelegt wird. Man hat zwar weiterhin keine "echte" Vererbung zwischen den verschiedenen Listen, allerdings hat man zumindest die mehrfache Implementierung von MyMethod an den Compiler delegiert.&lt;/p&gt;&lt;img src="http://blogs.escde.net/jochen/aggbug/60.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jochen</dc:creator>
            <guid>http://blogs.escde.net/jochen/archive/2007/02/21/60.aspx</guid>
            <pubDate>Wed, 21 Feb 2007 09:34:53 GMT</pubDate>
            <wfw:comment>http://blogs.escde.net/jochen/comments/60.aspx</wfw:comment>
            <comments>http://blogs.escde.net/jochen/archive/2007/02/21/60.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.escde.net/jochen/comments/commentRss/60.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.escde.net/jochen/services/trackbacks/60.aspx</trackback:ping>
        </item>
        <item>
            <title>Objekte rechtzeitig erzeugen - aber nicht alle auf einmal!</title>
            <category>.Net 2.0</category>
            <link>http://blogs.escde.net/jochen/archive/2007/02/14/59.aspx</link>
            <description>&lt;p&gt;Nach längerer Blogging-Abstinenz gibt es nun endlich mal wieder einen neuen Eintrag. Außerdem bin ich voller Hoffnung, dass ich nun wieder öfters Zeit zum Bloggen finde ;-)&lt;/p&gt; &lt;p&gt;Heute möchte ich das Konzept des letzten Eintrags ("Objekte rechtzeitig erzeugen") ein wenig verbessern. In diesem Eintrag ging es darum, dass viele Algorithmen ganz schnell eine große Menge von Objekten eines bestimmten Typs für ihre Berechnungen brauchen. Um so schneller diese erzeugt werden, um so schneller läuft der Algorithmus. Optimal wäre es also, wenn die Objekte bereits existieren. Genau das macht die in diesem letzten Blog-Eintrag erstellte Klasse - sie erzeugt Objekte zu einem Zeitpunkt, zu dem die dafür benötigte Rechenleistung nicht ins Gewicht fällt.&lt;/p&gt; &lt;p&gt;Diese Klasse hat allerdings einen Nachteil: Alle benötigten Objekte werden auf einmal erzeugt. Das heißt, dass zu irgendeinem Zeitpunkt richtig viel Rechenpower verbraucht wird. Besser wäre es, wenn die Objekte alle schön nacheinander über einen größeren Zeitraum verteilt erzeugt werden. Während des normalen Programmablaufs einer WinForms-Anwendung würde es ja nicht stören, wenn einfach ein paar mal pro Sekunde einige wenige Objekte angelegt werden. Wird dann nach 5 Minuten der Rechen- (und Speicher- ) intensive Algorithmus gestartet, sind dann auch so die nötigen Objekte bereits vorhanden. &lt;/p&gt; &lt;p&gt;Die unten gezeigte ObjectCreator-Klasse implementiert solch ein Verhalten. Sie bedient sich hierzu der System.Windows.Timer-Klasse, welche in einem festen Intervall eine Methode von ObjectCreator aufruft. Zu diesen Zeitpunkten werden dann einige der verwalteten Objekte erstellt:&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:9509cba9-d2ca-4ada-9274-f9418faae8b9" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;class&lt;/span&gt;&lt;span style="color: #000000; "&gt; ObjectCreator&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;TargetType&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;where&lt;/span&gt;&lt;span style="color: #000000; "&gt; TargetType : &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;class&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt;()
    {
        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; in diesem Stack werden die Objekte gespeichert&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;protected&lt;/span&gt;&lt;span style="color: #000000; "&gt; Stack&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;TargetType&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; mObjects &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; Stack&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;TargetType&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;();
        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; der Timer, um regelmäßig Objekte zu erzeugen&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;protected&lt;/span&gt;&lt;span style="color: #000000; "&gt; Timer mTimer &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;null&lt;/span&gt;&lt;span style="color: #000000; "&gt;; 
        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; wie viele Objekte sollen in jedem Intervall erzeugt werden?&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;protected&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; mNumObjPerTick &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; "&gt;;
        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; wie viele Objekte sollen insgesamt erzeugt werden?&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;protected&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; mMaxObjs &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;1000&lt;/span&gt;&lt;span style="color: #000000; "&gt;;

        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Ermöglicht dem User, ein Maximum an verwalteten Objekten zu setzen / lesen&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; MaxObjects
        {
            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;get&lt;/span&gt;&lt;span style="color: #000000; "&gt; { &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.mMaxObjs; }
            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;set&lt;/span&gt;&lt;span style="color: #000000; "&gt; { &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;if&lt;/span&gt;&lt;span style="color: #000000; "&gt; (value &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.mMaxObjs &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; value; }
        }

        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Anzahl aktuell verfügbarer Objekte&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; CountCurrentObjects
        {
            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;get&lt;/span&gt;&lt;span style="color: #000000; "&gt; { &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.mObjects.Count; }
        }
        
        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Konstruktor, initialisiert den Timer&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; ObjectCreator()
        {
            mTimer &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; Timer();
            mTimer.Enabled &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;false&lt;/span&gt;&lt;span style="color: #000000; "&gt;;
            mTimer.Tick &lt;/span&gt;&lt;span style="color: #000000; "&gt;+=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; EventHandler(mTimer_Tick);
        }

        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; ein Objekt wird erstellt und auf dem Stack abgelegt&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; CreateObject()
        {
            TargetType tt &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; TargetType();
            mObjects.Push(tt);
        }

        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; gibt ein Objekt zurück und entfernt es aus dem Stack&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; TargetType GetObject()
        {
            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;if&lt;/span&gt;&lt;span style="color: #000000; "&gt; (mObjects.Count &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;)
                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; mObjects.Pop();
            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;else&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; TargetType();
        }

        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; aktiviert das automatischen Erzeugen von 
        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; NumObjObjekten alle MilliSecs Millisekunden&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; EnableAutoCreation(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; MilliSecs, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; NumObj)
        {
            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;if&lt;/span&gt;&lt;span style="color: #000000; "&gt; (MilliSecs &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000; "&gt; NumObj &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.mObjects.Count &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.mMaxObjs)
            {
                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.mTimer.Interval &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; MilliSecs;
                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.mNumObjPerTick &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; NumObj;
                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.mTimer.Enabled &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;true&lt;/span&gt;&lt;span style="color: #000000; "&gt;;
            }
        }

        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; deaktiviert die automatische Erzeugung wieder&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; DisableAutoCreation()
        {
            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.mTimer.Enabled &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;false&lt;/span&gt;&lt;span style="color: #000000; "&gt;;
        }

        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; wird vom Timer alle MilliSecs Millisekunden aufgerufen&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; mTimer_Tick(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;object&lt;/span&gt;&lt;span style="color: #000000; "&gt; sender, EventArgs e)
        {
            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;for&lt;/span&gt;&lt;span style="color: #000000; "&gt; (&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; i &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;; i &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.mNumObjPerTick; i&lt;/span&gt;&lt;span style="color: #000000; "&gt;++&lt;/span&gt;&lt;span style="color: #000000; "&gt;)
            {
                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.CreateObject();
            }
        }
    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Diese Implementierung verwendet einen Stack, um die erzeugten Objekte zwischenzuspeichern. Denkbar sind auch Ansätze mit anderen Container-Klassen, gerade auch ein Array kann sehr sinnvoll sein, da man sich bei geschickter Implementierung die Abfrage von "Count" in GetObject() sparen kann. &lt;/p&gt;
&lt;p&gt;Die Klasse ist außerdem generisch, kann also zum frühzeitigen erzeugen aller Datentypen verwendet werden, die selbst ein Referenztyp sind und über einen Konstruktor verfügen. Ausgeschlossen sind hiervon die integralen Datentypen wie beispielsweise int, float, etc. Hierfür müßte man die Implementierung minimal abändern.&lt;/p&gt;
&lt;p&gt;Grundsätzlich sollte man solche Klassen allerdings nur dann verwenden, wenn man wirklich viele Objekte verwendet, die auch noch eine gewisse Größe aufweisen. Bitmaps, Texturen, große Strings aber auch Klassen, die viele Membervariablen haben wären sinnvolle Beispiele. Bei der Anwendung sollte man auf jeden Fall testen, ob sich ein Geschwindigkeitsvorteil ergibt. Ist das Problem zu "gering", kann der Versuch durchaus nach hinten gehen, da der Verwaltungsaufwand nicht unerheblich ist. Bei großen Datenmengen kann man allerdings eine Geschwindigkeitssteigerung von Faktor 10 oder mehr verbuchen. &lt;/p&gt;&lt;img src="http://blogs.escde.net/jochen/aggbug/59.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jochen</dc:creator>
            <guid>http://blogs.escde.net/jochen/archive/2007/02/14/59.aspx</guid>
            <pubDate>Wed, 14 Feb 2007 15:08:10 GMT</pubDate>
            <wfw:comment>http://blogs.escde.net/jochen/comments/59.aspx</wfw:comment>
            <comments>http://blogs.escde.net/jochen/archive/2007/02/14/59.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.escde.net/jochen/comments/commentRss/59.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.escde.net/jochen/services/trackbacks/59.aspx</trackback:ping>
        </item>
        <item>
            <title>Objekte rechtzeitig erzeugen</title>
            <category>.Net 2.0</category>
            <link>http://blogs.escde.net/jochen/archive/2006/09/08/48.aspx</link>
            <description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;Oftmals kommt man als Entwickler in die Verlegenheit, dass große Mengen von Objekten in kurzer Zeit erstellt werden müssen. Ein gutes Beispiel hierfür sind Algorithmen, welche während ihrer Laufzeit viele Objekte benötigen um Zustände und Zwischenergebnisse zu speichern. &lt;/p&gt;&lt;p&gt;Üblicherweise werden diese Objekte genau zu dem Zeitpunkt erstellt, zu dem sie auch benötigt werden, also mitten im Algorithmus. Das Erzeugen dieser Objekte kann allerdings recht teuer sein, wenn man bedenkt, dass die .NET Runtime hierzu erst passenden Speicher finden und reservieren muss.&lt;br /&gt;Die Anzahl der verwendeten Objekte steht meist in Relation zu der Problemgröße, beispielsweise der Anzahl an untersuchten Dateien, der Größe eines Eingabearrays oder Ähnlichem. Hierdurch hat man meist schon vor dem Start des Algorithmus eine Ahnung, wie viele Objekte wohl benötigt werden. Dieses Wissen möchten wir uns hier nun zu Nutze machen. &lt;/p&gt;&lt;p&gt;Weiß man nämlich bereits vorab, wie viele Objekte benötigt werden, kann man diese bereits vor dem Ablauf des Algorithmus anlegen und die eigentliche Rechenzeit des Algorithmus somit verkürzen. Nehmen wir einmal an, Ihr Algorithmus würde während seiner Laufzeit viele Objekte des folgenden Typs benötigen:&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:31958cce-f0c5-43f9-8ced-e50d7b7d0b19" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;class&lt;/span&gt;&lt;span style="color: #000000; "&gt; MemoryChunk
{
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt;[] iData &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt;[&lt;/span&gt;&lt;span style="color: #000000; "&gt;100&lt;/span&gt;&lt;span style="color: #000000; "&gt;];
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Diese Klasse ist zwar recht unkompliziert, verlangt der .NET-Runtime jedoch einiges ab. Für eine Anwendung wäre es ein deutlicher Vorteil, wenn das erstellen dieser „Speicherklumpen“ bereits vorbereitet werden könnte.
&lt;/p&gt;&lt;p&gt;Zu diesem Zweck erstellen wir eine weitere Klasse, den ObjectCreator:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:59c5799a-1391-41b7-af77-cf74b6371399" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;class&lt;/span&gt;&lt;span style="color: #000000; "&gt; ObjectCreator&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;TargetType&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;where&lt;/span&gt;&lt;span style="color: #000000; "&gt; TargetType : &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;class&lt;/span&gt;&lt;span style="color: #000000; "&gt; , &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt;()
{
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;private&lt;/span&gt;&lt;span style="color: #000000; "&gt; TargetType[] mObjects;

    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; mIndex &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;;

    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; ObjectCreator()
    {
    }

    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; CreateObjects(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; iCount)
    {
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;if&lt;/span&gt;&lt;span style="color: #000000; "&gt; (iCount &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;)
        {
            mIndex &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; iCount &lt;/span&gt;&lt;span style="color: #000000; "&gt;-&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; "&gt;;

            mObjects &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; TargetType[iCount];

            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;for&lt;/span&gt;&lt;span style="color: #000000; "&gt; (&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; i &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;; i &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; iCount; i&lt;/span&gt;&lt;span style="color: #000000; "&gt;++&lt;/span&gt;&lt;span style="color: #000000; "&gt;)
            {
                TargetType obj &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; TargetType();
                mObjects[i] &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; obj;
            }
        }
    }

    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; TargetType NewObject()
    {
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;if&lt;/span&gt;&lt;span style="color: #000000; "&gt; (mIndex &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;)
        {
            TargetType obj &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.mObjects[mIndex];
            mIndex&lt;/span&gt;&lt;span style="color: #000000; "&gt;--&lt;/span&gt;&lt;span style="color: #000000; "&gt;;
            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; obj;
        }
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;else&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;null&lt;/span&gt;&lt;span style="color: #000000; "&gt;;
        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; oder: else return new TargetType();&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;    }
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Wie Sie sehen handelt es sich hierbei um eine generische Klasse. TargetType gibt hierbei den Typ der zu erstellenden Objekte an, beispielsweise MemoryChunk. Durch Aufruf der Methode CreateObjects(AnzahlObj) können Sie ObjectCreator dazu veranlassen, AnzahlObj Objekte anzulegen. Durch Aufruf der Methode NewObject wird nun nach und nach je eines dieser Objekte zurückgegeben.
&lt;/p&gt;&lt;p&gt;Die Anwendung der Klasse liegt nun auf der Hand: Wissen Sie beispielsweise, dass Ihr (gleich startender) Algorithmus 800 MemoryChunk-Objekte benötigt, erstellen Sie eine Instanz der Klasse ObjectCreator und rufen CreateObjects auf:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:5e413af4-75ca-4c70-87b3-d2837c51a836" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #000000; "&gt;ObjectCreator&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;MemoryChunk&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; Creator &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; ObjectCreator&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;MemoryChunk&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;();
Creator.CreateObjects(&lt;/span&gt;&lt;span style="color: #000000; "&gt;800&lt;/span&gt;&lt;span style="color: #000000; "&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Alle Codezeilen, in denen Sie innerhalb des Algorithmus ein MemoryChunk-Objekt erstellen, z.B. durch:
&lt;/p&gt;&lt;p&gt;MemoryChunk mem = new MemoryChunk();
&lt;/p&gt;&lt;p&gt;können Sie nun durch den folgenden Aufruf ersetzen:
&lt;/p&gt;&lt;p&gt;MemoryChunk mem = Creator.NewObject();
&lt;/p&gt;&lt;p&gt;Da die hier zurückgegebenen Objekte bereits existieren, werden Sie durch eine deutlich beschleunigte Laufzeit belohnt.
&lt;/p&gt;&lt;p&gt;Nun kann man richtigerweise einwenden, dass die Objekte so oder so erstellt werden müssen, in der Summe sollte der Aufwand daher gleich bleiben. Dies ist so sicher richtig, allerdings gibt es viele Situationen, in denen man die „gesammelte“ Objekterstellung in Zeiten des Leerlaufs unterbringen kann. Nehmen Sie beispielsweise an, der Anwender fügt Einträge in einer Liste ein, welche anschließend von einem Algorithmus verarbeitet werden sollen. Während der Anwender den Mauszeiger zum Menüpunkt des Algorithmus bewegt, besteht genug Zeit, die nötigen Objekte vorab zu erstellen und die Wartezeit aufgrund der Abarbeitung für den Anwender zu minimieren.&lt;/p&gt;&lt;img src="http://blogs.escde.net/jochen/aggbug/48.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jochen</dc:creator>
            <guid>http://blogs.escde.net/jochen/archive/2006/09/08/48.aspx</guid>
            <pubDate>Fri, 08 Sep 2006 13:05:34 GMT</pubDate>
            <wfw:comment>http://blogs.escde.net/jochen/comments/48.aspx</wfw:comment>
            <comments>http://blogs.escde.net/jochen/archive/2006/09/08/48.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.escde.net/jochen/comments/commentRss/48.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.escde.net/jochen/services/trackbacks/48.aspx</trackback:ping>
        </item>
        <item>
            <title>Schattenpolymorphie</title>
            <category>.Net 2.0</category>
            <category>VB.Net</category>
            <link>http://blogs.escde.net/jochen/archive/2006/09/08/47.aspx</link>
            <description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;Seit Version 6.0 hat sich Visual Basic deutlich weiterentwickelt. Hierbei fällt einem vor allem die nun (endlich) richtige Objektorientierung auf. &lt;/p&gt;&lt;p&gt;Inzwischen dürften wohl die meisten Visual Basic (2005) Programmierer mit den grundlegenden Mechanismen der Objektorientierung - Kapselung, Vererbung und Polymorphie - vertraut sein. Aber es gibt noch einige wenig bekannte Mechanismen, welche in Ausnahmesituationen recht hilfreich sein können. &lt;/p&gt;&lt;p&gt;Ein solcher Mechanismus ist "Shadowing". Stellen Sie sich vor, Sie haben eine Klasse A, welche eine Methode "Method()" enthällt. Der Aufruf von Method() erzeugt folgende Ausgabe: &lt;/p&gt;&lt;p&gt;"Eine Nachricht von Klasse A!" &lt;/p&gt;&lt;p&gt;Der passende Code würde so aussehen:&lt;br /&gt; &lt;/p&gt;&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:ddb442b1-f8ff-4f1b-b6d6-6ae48158a927" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;Class&lt;/span&gt;&lt;span style="color: #000000; "&gt; A
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Overridable&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt; MyMethod()
       Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Eine Nachricht von Klasse A!&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;)
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Class&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Nun schreiben Sie eine weitere Klasse namens B, welche von A erbt. Sie überschreiben die Methode "Method()", so dass diese nun folgende Ausgabe vornimmt:
&lt;/p&gt;&lt;p&gt;"Eine Nachricht von Klasse B!"
&lt;/p&gt;&lt;p&gt;Diese würde wie folgt aussehen:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:6d9d2a4b-6a6b-4949-a984-886ae303cb35" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;Class&lt;/span&gt;&lt;span style="color: #000000; "&gt; B : &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Inherits&lt;/span&gt;&lt;span style="color: #000000; "&gt; A
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Overrides&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt; MyMethod()
        Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Eine Nachricht von Klasse B!&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;)
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Class&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Nun könten Sie folgendes tun:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:e5c36ffc-5ef2-498b-befc-359b7e286e00" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; a &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;New&lt;/span&gt;&lt;span style="color: #000000; "&gt; A
a.Method()

&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; b &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;New&lt;/span&gt;&lt;span style="color: #000000; "&gt; B
b.Method()

a &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; b
a.Method()&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Die Ausgabe wäre dank Polymorphie folgende:
&lt;/p&gt;&lt;p&gt;"Eine Nachricht von Klasse A!"&lt;br /&gt;"Eine Nachricht von Klasse B!"&lt;br /&gt;"Eine Nachricht von Klasse B!"
&lt;/p&gt;&lt;p&gt;Was aber, wenn Sie möchten, dass sich ein Objekt sich wie der Typ verhällt, den die darauf zeigende Referenz hat? Hierzu können Sie sich des "Shadows" Schlüsselwortes bedienen. Schreiben Sie hierzu die Klasse B wie folgt:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:2f7a14b3-45e2-4dcf-99e7-53ed91b9fe99" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;Class&lt;/span&gt;&lt;span style="color: #000000; "&gt; B : &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Inherits&lt;/span&gt;&lt;span style="color: #000000; "&gt; A
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Shadows&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt; MyMethod()
        Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Eine Nachricht von Klasse B!&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;)
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Class&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Die Ausgabe des Testcodes sieht nun wie folgt aus:
&lt;/p&gt;&lt;p&gt;"Eine Nachricht von Klasse A!"&lt;br /&gt;"Eine Nachricht von Klasse B!"&lt;br /&gt;"Eine Nachricht von Klasse A!"
&lt;/p&gt;&lt;p&gt;Shadows bewirkt also, das bei Methodenaufrufen durch eine "A"-Referenz, die Methode der A-Klasse aufgerufen wird, während bei einer "B"-Referenz die Methode von B genommen wird. Man könnte Shadows sozusagen auch als "Antipolymorphie" bezeichnen.
&lt;/p&gt;&lt;p&gt;Nun, wann braucht man Shadows? Eigentlich sollte man es gar nicht benötigen, wenn Sie Shadows ernsthaft nutzen deutet dies meist auf einen Design-Fehler hin.
&lt;/p&gt;&lt;p&gt;Allerdings gibt es einige wenige Situationen, in denen es sich durchaus als nützlich erweist. Stellen Sie sich vor, Sie entwickeln ein Control, welches andere Entwickler via Visual Studio Designer auf ein Form ziehen können. Anschließend kann der Entwickler via Properties Window die Eigenschaften des Controls bearbeiten.&lt;br /&gt;Nun kann es passieren, dass dieses Control im Properties Window Eigenschaften anbietet, welche es von einer Basisklasse geerbt hat. Sie möchten diese dem Entwickler in Ihrem Control aber nicht anbieten. Durch Shadows können Sie solche Eigenschaften "verstecken", indem Sie beispielsweise das [Browsable(false)] Attribut anhängen.
&lt;/p&gt;&lt;p&gt;An diesem Beispiel erkennt man aber schon, dass Shadows eher in Randsituationen benötigt wird und nicht in einem ordentlichen, objektorientierten Entwurf. Hier sollten Sie wirklich Abstand von der "dunklen Seite der Polymorphie" halten...&lt;/p&gt;&lt;img src="http://blogs.escde.net/jochen/aggbug/47.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jochen</dc:creator>
            <guid>http://blogs.escde.net/jochen/archive/2006/09/08/47.aspx</guid>
            <pubDate>Fri, 08 Sep 2006 08:17:34 GMT</pubDate>
            <wfw:comment>http://blogs.escde.net/jochen/comments/47.aspx</wfw:comment>
            <comments>http://blogs.escde.net/jochen/archive/2006/09/08/47.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.escde.net/jochen/comments/commentRss/47.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.escde.net/jochen/services/trackbacks/47.aspx</trackback:ping>
        </item>
    </channel>
</rss>