<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>VB.NET</title>
        <link>http://blog.codemurai.de/category/VB.NET.aspx</link>
        <description>VB.NET</description>
        <language>de-DE</language>
        <copyright>André Krämer</copyright>
        <generator>Subtext Version 2.6.0.1</generator>
        <item>
            <title>VB.NET: Lustige Effekte mit dem &amp;quot;With-Block&amp;quot;</title>
            <link>http://blog.codemurai.de/archive/2008/07/17/vb-net-lustige-effekte-mit-dem-quotwith-blockquot.aspx</link>
            <description>&lt;p&gt;Wie in meinem letzten Blog-Post geschrieben, arbeite ich derzeit nach langer Abstinenz wieder an einigen VB.NET Projekten. Dabei stieß ich auch auf den &amp;quot;With-Block&amp;quot;, einen alten Bekannten aus VB 6 Zeiten, von dem in diesen Projekten intensiver Gebrauch gemacht wurde. Ein solches Konstrukt erlaubt es innerhalb eines Blocks ein Objekt anzugeben, auf das alle Statements ausgeführt werden, die nicht näher qualifiziert werden. So kann man einiges an Tipp-Arbeit sparen. Folgendes Beispiel soll dies verdeutlichen: &lt;/p&gt;  &lt;p&gt;&lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red163\green21\blue21;\red0\green128\blue0;}??\fs20   \cf3 Sub\cf0  Main()\par ??    \cf3 Dim\cf0  p \cf3 As\cf0  Person = \cf3 New\cf0  Person\par ??    \cf3 With\cf0  p\par ??      .Name = \cf4 "Mueller"\par ??\cf0       .Age = 29\par ??      Console.WriteLine(\cf4 "Name:\{0\}, Alter:\{1\}"\cf0 , .Name, .Age)   \cf5 ' Wird hier nun Mueller oder Meier ausgegeben?\par ??\cf0     \cf3 End\cf0  \cf3 With\par ??\par ??\cf0     Console.Read()\par ??  \cf3 End\cf0  \cf3 Sub}
--&gt;&lt;/p&gt;  &lt;div style="font-size: 10pt; background: white; color: black; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span&gt;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;Sub&lt;/span&gt;&lt;span&gt; Main()&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;Dim&lt;/span&gt;&lt;span&gt; p &lt;/span&gt;&lt;span style="color: blue"&gt;As&lt;/span&gt;&lt;span&gt; Person = &lt;/span&gt;&lt;span style="color: blue"&gt;New&lt;/span&gt;&lt;span&gt; Person&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;With&lt;/span&gt;&lt;span&gt; p&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Name = &lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;Mueller&amp;quot;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Age = 29&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;Name:{0}, Alter:{1}&amp;quot;&lt;/span&gt;&lt;span&gt;, .Name, .Age)&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;End&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: blue"&gt;With&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; Console.Read()&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span&gt;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;End&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: blue"&gt;Sub&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;So gerne ich das &lt;em&gt;With&lt;/em&gt; ... &lt;em&gt;End With&lt;/em&gt; auch unter VB 6 genutzt hatte, so zuwider war mir nach nun mehr als sechs Jahren C# die Nutzung unter VB.NET. Ich hatte das Gefühl, dass mein Code durch den Einsatz des &amp;quot;With-Blocks&amp;quot; Struktur und Lesbarkeit verlor und eine Hintertür für unnötige Fehlerquellen geöffnet wird.&lt;/p&gt;  &lt;p&gt;Bestätigt wurde mein Gefühl als ich Zeilen in folgender Art las:&lt;/p&gt;  &lt;p&gt;&lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red163\green21\blue21;\red0\green128\blue0;}??\fs20   \cf3 Sub\cf0  Main()\par ??    \cf3 Dim\cf0  p \cf3 As\cf0  Person = \cf3 New\cf0  Person\par ??    \cf3 With\cf0  p\par ??      .Name = \cf4 "Mueller"\par ??\cf0       .Age = 29\par ??      p = \cf3 New\cf0  Person\par ??      p.Age = 21\par ??      p.Name = \cf4 "Meier"\par ??\cf0       Console.WriteLine(\cf4 "Name:\{0\}, Alter:\{1\}"\cf0 , .Name, .Age)   \cf5 ' Wird hier nun Mueller oder Meier ausgegeben?\par ??\cf0       Console.WriteLine(\cf4 "Name:\{0\}, Alter:\{1\}"\cf0 , p.Name, p.Age) \cf5 ' Gleicht die Ausgabe dieser Zeile der vorherigen?\par ??\cf0     \cf3 End\cf0  \cf3 With\par ??\par ??\cf0     Console.Read()\par ??  \cf3 End\cf0  \cf3 Sub}
--&gt;&lt;/p&gt;  &lt;div style="border-top-width: 1px; border-left-width: 1px; font-size: 10pt; background: white; border-bottom-width: 1px; color: black; font-family: courier new; border-right-width: 1px"&gt;   &lt;p style="margin: 0px"&gt;&amp;#160; &lt;span style="color: blue"&gt;Sub&lt;/span&gt; Main()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;Dim&lt;/span&gt; p &lt;span style="color: blue"&gt;As&lt;/span&gt; Person = &lt;span style="color: blue"&gt;New&lt;/span&gt; Person&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;With&lt;/span&gt; p&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Name = &lt;span style="color: #a31515"&gt;&amp;quot;Mueller&amp;quot;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Age = 29&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; p = &lt;span style="color: blue"&gt;New&lt;/span&gt; Person&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; p.Age = 21&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; p.Name = &lt;span style="color: #a31515"&gt;&amp;quot;Meier&amp;quot;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&lt;span style="color: #a31515"&gt;&amp;quot;Name:{0}, Alter:{1}&amp;quot;&lt;/span&gt;, .Name, .Age)&amp;#160; &lt;span style="color: green"&gt;' Wird hier nun Mueller oder Meier ausgegeben?&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&lt;span style="color: #a31515"&gt;&amp;quot;Name:{0}, Alter:{1}&amp;quot;&lt;/span&gt;, p.Name, p.Age) &lt;span style="color: green"&gt;' Gleicht die Ausgabe dieser Zeile der vorherigen?&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;End&lt;/span&gt; &lt;span style="color: blue"&gt;With&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; Console.Read()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160; &lt;span style="color: blue"&gt;End&lt;/span&gt; &lt;span style="color: blue"&gt;Sub&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;An dieser Stelle war sich das gesamte Team unsicher, welchen Effekt die Zeile &lt;em&gt;p = new Person&lt;/em&gt; innerhalb des Blocks haben wird. Es herrschte rege Diskussion, ob nur die Anweisungen, die über &amp;quot;&lt;em&gt;p.&lt;/em&gt;&amp;quot; qualifiziert werden das neue Objekt verändern, oder ob auch die Anweisungen die nur über den &amp;quot;.&amp;quot; qualifiziert werden das neue Objekt verändern.&lt;/p&gt;  &lt;p&gt;Um die Antwort vorweg zu nehmen: Wir haben nun &lt;strong&gt;zwei&lt;/strong&gt; Objekte von der Klasse Person im Speicher, die beide referenziert werden. Das ursprüngliche Objekt wird durch &amp;quot;.&amp;quot; angesprochen, dass neu erstelle Objekt durch &amp;quot;p.&amp;quot;.&lt;/p&gt;  &lt;p&gt;Sehr schön sieht man das ganze auch wenn man sich den zugehörigen IL-Code ansieht:&lt;/p&gt;  &lt;p&gt;&lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red163\green21\blue21;}??\fs20 .method \cf3 public\cf0  \cf3 static\cf0  void Main() cil managed\par ??\{\par ??    .custom instance void [mscorlib]System.STAThreadAttribute::.ctor()\par ??    .entrypoint\par ??    .maxstack 3\par ??    .locals init (\par ??        [0] \cf3 class\cf0  WithTest.Person p,\par ??        [1] \cf3 class\cf0  WithTest.Person VB$t_ref$L0)\par ??    L_0000: nop \par ??    L_0001: newobj instance void WithTest.Person::.ctor()\par ??    L_0006: stloc.0 \par ??    L_0007: ldloc.0 \par ??    L_0008: stloc.1 \par ??    L_0009: ldloc.1 \par ??    L_000a: ldstr \cf4 "Mueller"\par ??\cf0     L_000f: callvirt instance void WithTest.Person::set_Name(\cf3 object\cf0 )\par ??    L_0014: nop \par ??    L_0015: ldloc.1 \par ??    L_0016: ldc.i4.s 0x1d\par ??    L_0018: box int32\par ??    L_001d: callvirt instance void WithTest.Person::set_Age(\cf3 object\cf0 )\par ??    L_0022: nop \par ??    L_0023: newobj instance void WithTest.Person::.ctor()\par ??    L_0028: stloc.0 \par ??    L_0029: ldloc.0 \par ??    L_002a: ldstr \cf4 "Meier"\par ??\cf0     L_002f: callvirt instance void WithTest.Person::set_Name(\cf3 object\cf0 )\par ??    L_0034: nop \par ??    L_0035: ldloc.0 \par ??    L_0036: ldc.i4.s 0x15\par ??    L_0038: box int32\par ??    L_003d: callvirt instance void WithTest.Person::set_Age(\cf3 object\cf0 )\par ??    L_0042: nop \par ??    L_0043: ldstr \cf4 "Name:\{0\}, Alter:\{1\}"\par ??\cf0     L_0048: ldloc.1 \par ??    L_0049: callvirt instance \cf3 object\cf0  WithTest.Person::get_Name()\par ??    L_004e: \cf3 call\cf0  \cf3 object\cf0  [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::GetObjectValue(\cf3 object\cf0 )\par ??    L_0053: ldloc.1 \par ??    L_0054: callvirt instance \cf3 object\cf0  WithTest.Person::get_Age()\par ??    L_0059: \cf3 call\cf0  \cf3 object\cf0  [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::GetObjectValue(\cf3 object\cf0 )\par ??    L_005e: \cf3 call\cf0  void [mscorlib]System.Console::WriteLine(\cf3 string\cf0 , \cf3 object\cf0 , \cf3 object\cf0 )\par ??    L_0063: nop \par ??    L_0064: ldstr \cf4 "Name:\{0\}, Alter:\{1\}"\par ??\cf0     L_0069: ldloc.0 \par ??    L_006a: callvirt instance \cf3 object\cf0  WithTest.Person::get_Name()\par ??    L_006f: \cf3 call\cf0  \cf3 object\cf0  [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::GetObjectValue(\cf3 object\cf0 )\par ??    L_0074: ldloc.0 \par ??    L_0075: callvirt instance \cf3 object\cf0  WithTest.Person::get_Age()\par ??    L_007a: \cf3 call\cf0  \cf3 object\cf0  [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::GetObjectValue(\cf3 object\cf0 )\par ??    L_007f: \cf3 call\cf0  void [mscorlib]System.Console::WriteLine(\cf3 string\cf0 , \cf3 object\cf0 , \cf3 object\cf0 )\par ??    L_0084: nop \par ??    L_0085: ldnull \par ??    L_0086: stloc.1 \par ??    L_0087: \cf3 call\cf0  int32 [mscorlib]System.Console::Read()\par ??    L_008c: pop \par ??    L_008d: nop \par ??    L_008e: ret \par ??\}}
--&gt;&lt;/p&gt;  &lt;div style="font-size: 10pt; background: white; color: black; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span&gt;.method &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt;&lt;span&gt; void Main() cil managed&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt;&amp;#160;&lt;span&gt;{&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; .custom instance void [mscorlib]System.STAThreadAttribute::.ctor()&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; .entrypoint&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; .maxstack 3&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; .locals init (&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [0] &lt;/span&gt;&lt;span style="color: blue"&gt;class&lt;/span&gt;&lt;span&gt; WithTest.Person p,&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [1] &lt;/span&gt;&lt;span style="color: blue"&gt;class&lt;/span&gt;&lt;span&gt; WithTest.Person VB$t_ref$L0)&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0000: nop &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0001: newobj instance void WithTest.Person::.ctor()&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0006: stloc.0 &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 12&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0007: ldloc.0 &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 13&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0008: stloc.1 &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 14&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0009: ldloc.1 &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 15&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_000a: ldstr &lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;Mueller&amp;quot;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 16&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_000f: callvirt instance void WithTest.Person::set_Name(&lt;/span&gt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 17&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0014: nop &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 18&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0015: ldloc.1 &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 19&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0016: ldc.i4.s 0x1d&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 20&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0018: box int32&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 21&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_001d: callvirt instance void WithTest.Person::set_Age(&lt;/span&gt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 22&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0022: nop &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 23&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0023: newobj instance void WithTest.Person::.ctor()&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 24&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0028: stloc.0 &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 25&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0029: ldloc.0 &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 26&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_002a: ldstr &lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;Meier&amp;quot;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 27&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_002f: callvirt instance void WithTest.Person::set_Name(&lt;/span&gt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 28&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0034: nop &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 29&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0035: ldloc.0 &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 30&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0036: ldc.i4.s 0x15&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 31&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0038: box int32&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 32&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_003d: callvirt instance void WithTest.Person::set_Age(&lt;/span&gt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 33&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0042: nop &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 34&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0043: ldstr &lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;Name:{0}, Alter:{1}&amp;quot;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 35&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0048: ldloc.1 &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 36&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0049: callvirt instance &lt;/span&gt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&lt;span&gt; WithTest.Person::get_Name()&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 37&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_004e: &lt;/span&gt;&lt;span style="color: blue"&gt;call&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&lt;span&gt; [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::GetObjectValue(&lt;/span&gt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 38&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0053: ldloc.1 &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 39&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0054: callvirt instance &lt;/span&gt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&lt;span&gt; WithTest.Person::get_Age()&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 40&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0059: &lt;/span&gt;&lt;span style="color: blue"&gt;call&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&lt;span&gt; [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::GetObjectValue(&lt;/span&gt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 41&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_005e: &lt;/span&gt;&lt;span style="color: blue"&gt;call&lt;/span&gt;&lt;span&gt; void [mscorlib]System.Console::WriteLine(&lt;/span&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 42&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0063: nop &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 43&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0064: ldstr &lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;Name:{0}, Alter:{1}&amp;quot;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 44&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0069: ldloc.0 &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 45&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_006a: callvirt instance &lt;/span&gt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&lt;span&gt; WithTest.Person::get_Name()&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 46&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_006f: &lt;/span&gt;&lt;span style="color: blue"&gt;call&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&lt;span&gt; [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::GetObjectValue(&lt;/span&gt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 47&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0074: ldloc.0 &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 48&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0075: callvirt instance &lt;/span&gt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&lt;span&gt; WithTest.Person::get_Age()&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 49&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_007a: &lt;/span&gt;&lt;span style="color: blue"&gt;call&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&lt;span&gt; [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::GetObjectValue(&lt;/span&gt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 50&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_007f: &lt;/span&gt;&lt;span style="color: blue"&gt;call&lt;/span&gt;&lt;span&gt; void [mscorlib]System.Console::WriteLine(&lt;/span&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 51&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0084: nop &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 52&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0085: ldnull &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 53&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0086: stloc.1 &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 54&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_0087: &lt;/span&gt;&lt;span style="color: blue"&gt;call&lt;/span&gt;&lt;span&gt; int32 [mscorlib]System.Console::Read()&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 55&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_008c: pop &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 56&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_008d: nop &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 57&lt;/span&gt;&amp;#160;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160; L_008e: ret &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 58&lt;/span&gt;&amp;#160;&lt;span&gt;}&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Wie man in den Zeilen 6 - 8 sieht werden zunächst zwei Variablen vom Typ Person auf dem Stack abgelegt. Die in unserem VB.NET SourceCode deklarierte Variable &lt;em&gt;p&lt;/em&gt; wird an der Index Position 0 des Stacks abgelegt (Zeile 7) und zusätzlich wird eine Variable &lt;em&gt;VB$t_ref$L0&lt;/em&gt; an der Position 1 abgelegt. Letzte Variable wird später zur Umsetzung unseres &amp;quot;With-Blocks&amp;quot; genutzt. In der Zeile 10 wird nun ein neues Objekt der Klasse Person erstellt und auf dem Evaluationsstack abgelegt. &lt;/p&gt;  &lt;p&gt;In der Zeile 11 wird dieses Objekt der lokalen Variablen am Index 0, also unserer Variablen &lt;em&gt;p&lt;/em&gt;, zugewiesen. In der Zeile 12 wird der Inhalt der Variablen am Index 0, also unser Personen Objekt, wieder auf den Evaluationsstack geladen, um in Zeile 13 schließlich der Variablen am Index 1 (&lt;em&gt;VB$t_ref$L0&lt;/em&gt;) zugewiesen zu werden.&lt;/p&gt;  &lt;p&gt;In den Zeilen 15 - 22 werden anschließend die Werte für den Namen und das Alter auf dem Stack abgelegt und die entsprechenden Setter-Methoden des durch die Variable am Index 1 (&lt;em&gt;VB$t_ref$L0&lt;/em&gt;) referenzierten Objektes aufgerufen.&lt;/p&gt;  &lt;p&gt;Bis hier hin ist die Welt noch in Ordnung. Wir haben zwei Variablen vom Typ Person, die beide das selbe Objekt referenzieren. Die Freude währt jedoch nur bis zur Zeile 23. In dieser Zeile wird nämlich ein neues Objekt vom Typ Person erstellt und in den folgenden Zeilen der lokalen Variablen am Index 0 (&lt;em&gt;p&lt;/em&gt;) zugewiesen. Ab diesem Zeitpunkt greifen die Anweisungen, die über &amp;quot;.&amp;quot; und die, die über &amp;quot;p.&amp;quot; qualifizieren auf verschiedene Objekte zu!&lt;/p&gt;  &lt;p&gt;Welche Fehler sich in solch einem Szenario bei kleinen Unachtsamkeiten&amp;#160; einschleichen können, liegt auf der Hand.&lt;/p&gt;  &lt;p&gt;Daher lautet mein persönliches Fazit:&lt;/p&gt;  &lt;p&gt;Die Zeit, die ich durchs Tippen beim Einsatz des &amp;quot;With-Blocks&amp;quot; spare, büße ich während der Fehlersuche unter Umständen mehrfach wieder ein. Daher lautet meine Devise für die Zukunft: Finger weg von &amp;quot;with... end with&amp;quot;.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Kommentare willkommen&lt;/em&gt; :-)&lt;/p&gt;&lt;img src="http://blog.codemurai.de/aggbug/181.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andre</dc:creator>
            <guid>http://blog.codemurai.de/archive/2008/07/17/vb-net-lustige-effekte-mit-dem-quotwith-blockquot.aspx</guid>
            <pubDate>Thu, 17 Jul 2008 08:59:28 GMT</pubDate>
            <comments>http://blog.codemurai.de/archive/2008/07/17/vb-net-lustige-effekte-mit-dem-quotwith-blockquot.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blog.codemurai.de/comments/commentRss/181.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Escape Sequenzen in Strings unter VB.NET aufl&amp;ouml;sen</title>
            <link>http://blog.codemurai.de/archive/2008/07/09/escape-sequenzen-in-strings-unter-vb-net-aufloumlsen.aspx</link>
            <description>&lt;p&gt;Nachdem ich die letzten Jahre meine Software fast ausschließlich unter C# entwickelte, musste ich kürzlich für einen Kunden an einem VB.NET Projekt arbeiten.&lt;/p&gt;  &lt;p&gt;Die Umgewöhnung in die Sprache klappte überraschend schnell und reibungslos. Allerdings übersah ich, dass VB.NET von Haus aus keine Escape Sequenzen, wie z. B. &lt;strong&gt;\n&lt;/strong&gt; für neue Zeile oder &lt;strong&gt;\t&lt;/strong&gt; für Tab unterstützt. Entsprechend sahen auf der Oberfläche auch meine ausgegebenen Strings aus.&lt;/p&gt;  &lt;p&gt;Auf der Suche nach einer Lösung bei der ich nicht sämtliche zuvor definierten Strings anpacken musste, stolperte ich fast ausnahmslos auf Ansätze, die &amp;#220;ber &lt;strong&gt;String.Replace()&lt;/strong&gt; die Escape Sequenzen gegen VB.NET Control Characters ersetzten.&lt;/p&gt;  &lt;p&gt;Eleganter fand ich allerdings folgende Lösung, die auf eine .NET Framework Standardklasse setzt:&lt;/p&gt; &lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;}??\fs20 message = System.Text.RegularExpressions.Regex.Unescape(message)}
--&gt;  &lt;div style="border-top-width: 1px; border-left-width: 1px; font-size: 10pt; background: white; border-bottom-width: 1px; color: black; font-family: courier new; border-right-width: 1px"&gt;   &lt;p style="margin: 0px"&gt;myString = System.Text.RegularExpressions.Regex.Unescape(myString)&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;... Ist doch irgendwie eleganter, oder? :-)&lt;/p&gt;&lt;img src="http://blog.codemurai.de/aggbug/182.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andre</dc:creator>
            <guid>http://blog.codemurai.de/archive/2008/07/09/escape-sequenzen-in-strings-unter-vb-net-aufloumlsen.aspx</guid>
            <pubDate>Wed, 09 Jul 2008 09:32:31 GMT</pubDate>
            <comments>http://blog.codemurai.de/archive/2008/07/09/escape-sequenzen-in-strings-unter-vb-net-aufloumlsen.aspx#feedback</comments>
            <wfw:commentRss>http://blog.codemurai.de/comments/commentRss/182.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>
