<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>.Net 2.0</title>
        <link>http://blogs.escde.net/jochen/category/7.aspx</link>
        <description>.Net 2.0</description>
        <language>en-US</language>
        <copyright>Jochen</copyright>
        <managingEditor>schimmel@escde.net</managingEditor>
        <generator>Subtext Version 1.9.3.0</generator>
        <item>
            <title>Objekte rechtzeitig erzeugen - aber nicht alle auf einmal!</title>
            <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>
            <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>
            <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>
        <item>
            <title>Das My Schl&amp;uuml;sselwort in Visual Basic .NET</title>
            <link>http://blogs.escde.net/jochen/archive/2006/09/05/46.aspx</link>
            <description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;Zum Leidwesen von Microsoft hat sich herausgestellt, dass extrem viele Visual Basic Programmierer den Sprung nach .NET verpasst haben. Die meisten hiervon absichtlich. Der Grund? Visual Basic .NET ist zu kompliziert, der Umstieg auf das (im Vergleich zur VB Runtime) komplexere .NET Framework dauert zu lange und lohnt sich nicht.  &lt;/p&gt;&lt;p&gt;Mit Visual Basic 2005 will Microsoft dies ändern und die Stärke des "alten VB" wieder in den Vordergrund stellen: Einfachheit.  &lt;/p&gt;&lt;p&gt;Ein großes Problem bei .NET stellen (für Visual Basic Veteranen) die vielen verschachtelten Namespaces dar. Unter Visual Basic 5/6 gab es eine Handvoll von Namespaces, oder sagen wir lieber "Gruppen", in denen eingentlich die komplette VB-Runtime Platz fand und trotzdem nicht unübersichtlich wurde.  &lt;/p&gt;&lt;p&gt;Aber auch die nun erzwungene und Lehrbuch-konforme Objektorientierung stößt bei vielen "VBlern" auf Unverständniss. Erinnen Sie sich an die Forms aus VB 5/6? Klassen waren das ja eigentlich nicht wirklich, von der Verwendung her eher Objekte... aber naja... mehrere Instanzen konnte man dann ja doch erstellen und überhaupt... es war irgendwie komisch, aber funktioniert hat's trotzdem... Nur verständlich dass der Umstieg auf UML-konforme Objektorientierung da ein Problem darstellt.  &lt;/p&gt;&lt;p&gt;"Was machen wir nun, um aus dieser Kiste wieder heil herauszukommen?", dachten sich nun die VB-Designer bei Microsoft. Und die Lösung heißt "My".  &lt;/p&gt;&lt;p&gt;My wenn Sie "My" gefolgt von "." in Visual Studio 2005 eintippen begrüßt Sie ein IntellySense Fenster, welches erst mal vermuten läßt, dass es sich bei My um einen Namepspace handelt. Ist es eigentlich auch! My soll die wichtigsten Funktionen aus dem .NET Framework herauspicken und zentral zur Verfügung stellen. Sie finden in My wiederum Namespaces wie z.B.:  &lt;/p&gt;&lt;ul&gt; &lt;li&gt;Application  &lt;/li&gt;&lt;li&gt;Computer  &lt;/li&gt;&lt;li&gt;Settings  &lt;/li&gt;&lt;li&gt;User &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;und einige mehr. Diese Namespaces fassen einige der wichtigsten Funktionen und Klassen kurz zusammen, um diese ohne große Umwege zugänglich zu machen.  &lt;/p&gt;&lt;p&gt;Sie möchten zum Beispiel auf den aktuell angemeldeten Benutzernamen zugreifen können? Kein Problem:  &lt;/p&gt;&lt;p&gt;My.User.Name  &lt;/p&gt;&lt;p&gt;Einfacher ging's auch mit dem alten VB nicht...  &lt;/p&gt;&lt;p&gt;Und um nochmal auf die Forms zurückzukommen: Ihre Fenster finden Sie jetzt alle direkt unter My.Forms. Das erinnert schon ein wenig an frühere Visual Basic Anwendungen, oder?&lt;/p&gt;&lt;img src="http://blogs.escde.net/jochen/aggbug/46.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jochen</dc:creator>
            <guid>http://blogs.escde.net/jochen/archive/2006/09/05/46.aspx</guid>
            <pubDate>Tue, 05 Sep 2006 14:21:34 GMT</pubDate>
            <wfw:comment>http://blogs.escde.net/jochen/comments/46.aspx</wfw:comment>
            <comments>http://blogs.escde.net/jochen/archive/2006/09/05/46.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.escde.net/jochen/comments/commentRss/46.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.escde.net/jochen/services/trackbacks/46.aspx</trackback:ping>
        </item>
        <item>
            <title>Fehlermeldung &amp;quot;Assembly 'name.dll' is required to be strongly named&amp;quot;</title>
            <link>http://blogs.escde.net/jochen/archive/2006/09/04/45.aspx</link>
            <description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;Beim Versuch, eine Assembly in den Global Assembly Cache (GAC) zu kopieren, erscheint die Fehlermeldung "Assembly 'name.dll' is required to be strongly named".&lt;br /&gt;&lt;strong&gt;Ursache:&lt;/strong&gt;&lt;br /&gt;Nur Assemblys mit einem strong name dürfen im GAC platziert werden. Hierzu muss ein public / private Key generiert werden um die Assembly zu signieren.&lt;br /&gt;&lt;strong&gt;Lösung:&lt;/strong&gt;&lt;br /&gt;Geben Sie "sn -k keyfile.snk" am Visual Studio 2003/2005 Command Prompt ein, wobei keyfile.snk den Dateinamen angibt, unter dem der erzeugte Key gespeichert wird.&lt;br /&gt;Visual Studio .NET 2003:&lt;br /&gt;Öffnen Sie Ihr Visual Studio Projekt und die Datei AssemblyInfo.cs und navigieren Sie zu folgender Zeile:&lt;br /&gt;[assembly: AssemblyKeyFile("")]&lt;br /&gt;Fügen Sie hier den Pfad zum generierten Key ein und kompilieren Sie Ihr Projekt neu.&lt;br /&gt;Visual Studio 2005:&lt;br /&gt;Öffnen Sie die Projekt Eigenschaften und wählen Sie den Punkt "Signing".&lt;br /&gt;Wählen Sie die Option "Sign the assembly" und wählen Sie die Datei mit Ihrem Key. Klicken Sie 'OK' und kompilieren Sie Ihr Projekt neu. Nun sollten Sie Ihre Assembly im GAC platzieren können.&lt;/p&gt;&lt;img src="http://blogs.escde.net/jochen/aggbug/45.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jochen</dc:creator>
            <guid>http://blogs.escde.net/jochen/archive/2006/09/04/45.aspx</guid>
            <pubDate>Mon, 04 Sep 2006 10:33:21 GMT</pubDate>
            <wfw:comment>http://blogs.escde.net/jochen/comments/45.aspx</wfw:comment>
            <comments>http://blogs.escde.net/jochen/archive/2006/09/04/45.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.escde.net/jochen/comments/commentRss/45.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.escde.net/jochen/services/trackbacks/45.aspx</trackback:ping>
        </item>
    </channel>
</rss>