<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.aspnetzone.de/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Peter Bucher : Tipps</title><link>http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Tipps/default.aspx</link><description>Ordnungsbegriffe: Tipps</description><dc:language /><generator>CommunityServer 2.1 SP2 (Build: 61120.2)</generator><item><title>Paypal Spenden Button in ASP.NET einfügen</title><link>http://www.aspnetzone.de/blogs/peterbucher/archive/2012/12/06/paypal-spenden-button-in-asp-net-einf-gen.aspx</link><pubDate>Thu, 06 Dec 2012 17:59:00 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:224809</guid><dc:creator>Peter Bucher</dc:creator><slash:comments>0</slash:comments><comments>http://www.aspnetzone.de/blogs/peterbucher/comments/224809.aspx</comments><wfw:commentRss>http://www.aspnetzone.de/blogs/peterbucher/commentrss.aspx?PostID=224809</wfw:commentRss><description>&lt;P&gt;Ich wollte einen Paypal Spenden Button auf der &lt;A href="http://lightcore.ch/"&gt;LightCore&lt;/A&gt; Seite einzufügen, doch ein Button mit komplettem Formular-Tag das von Paypal geliefert wird ist schlecht zu nutzen.&lt;BR&gt;In einen &lt;A href="http://www.devtheweb.net/blog/2010/01/21/how-to-integrate-paypal-donate-button-into-asp-net-page/"&gt;Blog&lt;/A&gt; fand ich ein Beispiel, wie ein Spenden Button per Link eingefügt werden kann, per GET also.&lt;BR&gt;&lt;BR&gt;Zuerst muss ein Button bei Paypal erstellt werden, damit die ID des Buttons verfügbar ist.&lt;BR&gt;&lt;BR&gt;Im folgenden Code dann nur noch die ID des Buttons durch die von Paypal ersetzen èt voila.&lt;BR&gt;&lt;BR&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;a&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;target&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="_blank"&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;href&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;amp;hosted_button_id=ButtonIDHierErsetzen"&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;Spende an Produkt XYZ&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;a&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;BR&gt;&lt;BR&gt;Kurz und schmerzlos, vielleicht kann es jemand gebrauchen.&lt;BR&gt;&lt;/P&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=224809" width="1" height="1"&gt;</description><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Tipps/default.aspx">Tipps</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Link/default.aspx">Link</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Button/default.aspx">Button</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Spenden/default.aspx">Spenden</category></item><item><title>Office 2010 installiert und Visual Studio 2008 friert ein?</title><link>http://www.aspnetzone.de/blogs/peterbucher/archive/2010/06/20/office-2010-installiert-und-visual-studio-2008-friert-ein.aspx</link><pubDate>Sun, 20 Jun 2010 20:38:00 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:217730</guid><dc:creator>Peter Bucher</dc:creator><slash:comments>0</slash:comments><comments>http://www.aspnetzone.de/blogs/peterbucher/comments/217730.aspx</comments><wfw:commentRss>http://www.aspnetzone.de/blogs/peterbucher/commentrss.aspx?PostID=217730</wfw:commentRss><description>&lt;P&gt;Nebenbei habe ich letztens Office 2010 installiert.&lt;BR&gt;Als ich dann wieder einmal Visual Studio 2008 benutzte, blieb die Anwendung im ASPX-Editor komplett hängen.&lt;/P&gt;
&lt;P&gt;Es musste der Prozess abgeschossen werden, um VS überhaupt beenden zu können.&lt;BR&gt;Mein Verdacht lag zuerst bei Resharper, was sich dann aber als falsch herausgestellt hat.&lt;/P&gt;
&lt;P&gt;Bei mir hat die Lösung mit dem Reparieren von den "Web Authoring Components" geholfen:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/b/webdevtools/archive/2010/04/19/upgrade-or-uninstall-of-office-2007-might-cause-vs-2008-web-designer-to-hang.aspx"&gt;http://blogs.msdn.com/b/webdevtools/archive/2010/04/19/upgrade-or-uninstall-of-office-2007-might-cause-vs-2008-web-designer-to-hang.aspx&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=217730" width="1" height="1"&gt;</description><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Tipps/default.aspx">Tipps</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Fehler/default.aspx">Fehler</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Visual%20Studio%202008/default.aspx">Visual Studio 2008</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Einfrieren/default.aspx">Einfrieren</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Office%202010/default.aspx">Office 2010</category></item><item><title>InternalsVisibleToAttribute und signierte Assemblies: So funktionierts garantiert.</title><link>http://www.aspnetzone.de/blogs/peterbucher/archive/2009/12/04/internalsvisibletoattribute-und-signierte-assemblies-so-funktionierts-garantiert.aspx</link><pubDate>Fri, 04 Dec 2009 15:46:00 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:214947</guid><dc:creator>Peter Bucher</dc:creator><slash:comments>3</slash:comments><comments>http://www.aspnetzone.de/blogs/peterbucher/comments/214947.aspx</comments><wfw:commentRss>http://www.aspnetzone.de/blogs/peterbucher/commentrss.aspx?PostID=214947</wfw:commentRss><description>&lt;P&gt;Stellt euch vor, ihr habt zwei Assemblies:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;MyProject.Core 
&lt;LI&gt;MyProject.Core.Tests &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Im Core-Projekt gibt es Typen, die nicht öffentlich gemacht werden sollten, allerdings für die UnitTests zugänglich sein sollen. &lt;BR&gt;Nun, das ist ein kleines Problem, wenn man das Attribut “InternalsVisibleTo” kennt, mithilfe folgender Dekleration in der &lt;STRONG&gt;AssemblyInfo.cs des MyProject.Core-Projekts&lt;/STRONG&gt; kann dies einfach erledigt werden:&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;[assembly: InternalsVisibleTo("MyProject.Core.Tests”)]&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;DIV class=Quotes&gt;&lt;BR =&gt;Das macht sogar sehr viel Sinn, denn sonst können Kollisionen und Verwechslungen der Extensionmethods beim Endbenutzer vorkommen.&lt;/DIV&gt;
&lt;P&gt;Soweit, so gut. Die Typen der MyProject.Core-Assembly sind jetzt in der MyProject.Core.Tests-Assembly sichtbar. &lt;BR&gt;Müssen die Projekte jedoch signiert sein, kommt es zu einem grösseren Problem.&lt;/P&gt;
&lt;P&gt;In &lt;A href="http://www.sturmnet.org/blog/2005/05/10/internalsvisibleto-sn"&gt;mehreren&lt;/A&gt; Blogs sind die nötigen Schritte &lt;A href="http://weblogs.asp.net/bhouse/archive/2006/04/17/443100.aspx"&gt;beschrieben&lt;/A&gt;, &lt;U&gt;jedoch werden da wichtige Punkte nicht genannt&lt;/U&gt;, die einem zur Verzweiflung treiben können. &lt;BR&gt;Die sind wie folgt:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Alle involvierten Assemblies müssen signiert werden. 
&lt;LI&gt;Der PublicKey muss vom Projekt bezogen werden, bei dem die Internals sichtbar werden sollen, in unserem Fall also das MyProject.Core.Tests-Projekt. &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Nach einer weiteren Suche bin ich schlussendlich auf einem (selbsternannten) Newbie-Blog fündig geworden. &lt;BR&gt;Noch später sties ich dann auf die folgende Anleitung, die eigentlich alles beinhaltet, sodass ich nicht alles im Detail niederschreiben muss, trotzdem die wichtigen Punkte nennen kann und vorallem die Lösung wieder einmal finde:&lt;/P&gt;
&lt;P&gt;Also, beachtet die oben stehenden zwei Punkte und haltet euch an folgende Anleitung:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A title=http://statestreetgang.net/post/2008/04/InternalsVisibleToAttribute-and-Strong-Named-Assemblies-Step-by-Step.aspx href="http://statestreetgang.net/post/2008/04/InternalsVisibleToAttribute-and-Strong-Named-Assemblies-Step-by-Step.aspx"&gt;http://statestreetgang.net/post/2008/04/InternalsVisibleToAttribute-and-Strong-Named-Assemblies-Step-by-Step.aspx&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=214947" width="1" height="1"&gt;</description><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Tipps/default.aspx">Tipps</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Assembly/default.aspx">Assembly</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/InternalsVisibleTo/default.aspx">InternalsVisibleTo</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/StrongName/default.aspx">StrongName</category></item><item><title>Generierung der designer.cs / vb Datei forcieren oder “Der Name ControlXYZ ist im aktuellen Kontext nicht vorhanden</title><link>http://www.aspnetzone.de/blogs/peterbucher/archive/2009/09/03/generierung-der-designer-cs-vb-datei-forcieren-oder-der-name-controlxyz-ist-im-aktuellen-kontext-nicht-vorhanden.aspx</link><pubDate>Thu, 03 Sep 2009 17:34:00 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:212767</guid><dc:creator>Peter Bucher</dc:creator><slash:comments>4</slash:comments><comments>http://www.aspnetzone.de/blogs/peterbucher/comments/212767.aspx</comments><wfw:commentRss>http://www.aspnetzone.de/blogs/peterbucher/commentrss.aspx?PostID=212767</wfw:commentRss><description>&lt;P&gt;Wenn eine ASPX- / ASCX-Datei ausserhalb vom Visual Studio Editor geändert wird, bekommt das der Designer nicht mit. &lt;BR&gt;Das Updaten der &amp;lt;Dateiname&amp;gt;.&amp;lt;Erweiterung&amp;gt;.designer.cs geschieht nicht sehr häufig und nur bei bestimmten Fällen.&lt;/P&gt;
&lt;P&gt;So kann es gut sehr gut sein, dass folgende Fehlermeldung beim Kompilieren erscheint:&lt;/P&gt;
&lt;DIV class=Error&gt;The name ‘ControlXYZ’ does not exists in the current context&lt;/DIV&gt;
&lt;P&gt;bzw.&lt;/P&gt;
&lt;DIV class=Error&gt;Der Name ControlXYZ ist im aktuellen Kontext nicht vorhanden&lt;/DIV&gt;
&lt;P&gt;Um die &lt;STRONG&gt;Neugenerierung&lt;/STRONG&gt; der Designer-Datei &lt;STRONG&gt;zu erzwingen&lt;/STRONG&gt;, kann die ASPX- / ASCX- Datei im Designer geöffnet werden, oder eine Eigenschaft hinzugefügt / geändert werden.&lt;/P&gt;
&lt;P&gt;Wenn das nichts nützt (Danke an &lt;A href="http://www.aspnetzone.de/blogs/stefanfalz/"&gt;Stefan&lt;/A&gt;):&lt;/P&gt;
&lt;DIV class=Quotes&gt;
&lt;P&gt;Leider funktioniert das aber lange nicht immer. Ich hab das gerade bei größeren Projekten (meist dann, wenn man in VS ein Control kopiert und umbenennt (inkl. Klassenname natürlich) öfter mal. Schon ein paar mal half schlußendlich nur das Löschen der Datei in VS und das erneute Erstellen. Reines Drag&amp;amp;Drop in das VS Projekt hinein half da auch nciht.&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;Mehr Details zu diesem Verhalten gibt es in folgendem Posting:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://social.msdn.microsoft.com/Forums/en-US/csharpide/thread/128202d7-5ecb-4921-8ac3-e173d4824235"&gt;Forcing regeneration of the designer.cs file&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=212767" width="1" height="1"&gt;</description><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Tipps/default.aspx">Tipps</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Fehler/default.aspx">Fehler</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Generierung/default.aspx">Generierung</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/designer_2E00_cs/default.aspx">designer.cs</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Designer/default.aspx">Designer</category></item><item><title>LINQ: Any, anyone? Range oder Repeat?</title><link>http://www.aspnetzone.de/blogs/peterbucher/archive/2009/09/01/linq-any-anyone-range-oder-repeat.aspx</link><pubDate>Tue, 01 Sep 2009 16:10:00 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:212663</guid><dc:creator>Peter Bucher</dc:creator><slash:comments>0</slash:comments><comments>http://www.aspnetzone.de/blogs/peterbucher/comments/212663.aspx</comments><wfw:commentRss>http://www.aspnetzone.de/blogs/peterbucher/commentrss.aspx?PostID=212663</wfw:commentRss><description>&lt;P&gt;Mit &lt;A href="http://de.wikipedia.org/wiki/LINQ"&gt;LINQ&lt;/A&gt; sind unzählige Erweiterungsmethoden für &lt;A href="http://msdn.microsoft.com/de-de/library/9eekhta0.aspx"&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/A&gt; hinzugekommen, die auch ausserhalb von LINQ Abfragen sehr nützlich sein können.&lt;/P&gt;
&lt;P&gt;Damit ich mir das merke und ihr evt. noch was neues kennenlernt, möchte ich zwei kurz vorstellen:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;A href="http://msdn.microsoft.com/de-de/library/system.linq.enumerable.any.aspx"&gt;Enumerable.Any()&lt;/A&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Kommt euch Code wie der folgende bekannt vor?&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;if&lt;/span&gt;(addresses.Count &amp;gt; 0) &lt;br /&gt;{ &lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// … &lt;/span&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;oder&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;if&lt;/span&gt;(addresses.Count == 0) &lt;br /&gt;{ &lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// … &lt;/span&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Das kann jetzt folgendermassen umgeschrieben werden:&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;if&lt;/span&gt;(addresses.Any()) &lt;br /&gt;{ &lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// … &lt;/span&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;und&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;if&lt;/span&gt;(!addresses.Any()) &lt;br /&gt;{ &lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// … &lt;/span&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Die Implementation der Any()-Methode holt sich den Enumerator der Auflistung und versucht den ersten Eintrag zu holen, wenn das klappt gibt sie true zurück, ansonsten false.&lt;/P&gt;
&lt;P&gt;Wenn Any() true zurückliefert, heisst das also, es ist mindestens ein Element vorhanden.&lt;/P&gt;
&lt;P&gt;PS: Darüber hinaus gibt es auch noch eine &lt;A href="http://msdn.microsoft.com/en-us/library/bb534972.aspx"&gt;zweite Überladung&lt;/A&gt;, der man Funktion einspeisen kann (Anonyme Methode, Lambda Ausdruck, …). Diese bestimmt dann, ob es mindestens ein Element hat, bei dem die Funktion true zurückliefert. &lt;BR&gt;Die Funktion nimmt ein Element vom Typ TSource entgegen und gibt einen bool zurück.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.range.aspx"&gt;Enumerable.Range()&lt;/A&gt; und &lt;STRONG&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/bb348899.aspx"&gt;Enumerable.Repeat()&lt;/A&gt;&lt;/STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Schon mal Testdaten benötigt, oder eine Liste von Zahlen die dann durcheinandergewürfelt werden? &lt;BR&gt;Das schreibt man im einfachsten Fall dann in etwa so:&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;List&amp;lt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;int&lt;/span&gt;&amp;gt; numbers &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;int&lt;/span&gt;&amp;gt;(); &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;for&lt;/span&gt;(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;int&lt;/span&gt; i=1; i &amp;lt;= 100; i++) &lt;br /&gt;{ &lt;br /&gt;    numbers.Add(i); &lt;br /&gt;} &lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// …&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Mit Enumerable.Range() geht das viel einfacher:&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt; &lt;br /&gt;&lt;br /&gt;var numbers &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; Enumerable.Range(1, 100);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// …&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Mit LINQ lässt sich ganz einfach eine gemischte Liste von Zahlen erstellen, zwei Zeilen braucht es dazu:&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;Random random &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; Random(); &lt;br /&gt;var numbers &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; Enumerable.Range(1, 100).OrderBy&amp;lt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;int&lt;/span&gt;, &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;int&lt;/span&gt;&amp;gt;(random.Next);&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Hier noch ein kleiner Hinweis: Um eine gleichmässige Verteilung einer solchen Liste zu erhalten, sollte ein Algorithmus wie bspw. &lt;A href="http://www.mycsharp.de/wbb2/thread.php?postid=198217#post198217"&gt;hier&lt;/A&gt; benutzt werden.&lt;/P&gt;
&lt;P&gt;An Enumerable.Repeat() hingegen kann im ersten Parameter eine Instanz übergeben werden, oder auch ein einfacher Wertetyp wie bspw. eine Zahl und eine Anzahl, wie häufig dieser Wert wiederholt werden soll. &lt;BR&gt;Schlussendlich bekommt man eine Auflistung zurück, das wars.&lt;/P&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=212663" width="1" height="1"&gt;</description><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Tipps/default.aspx">Tipps</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Range/default.aspx">Range</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Repeat/default.aspx">Repeat</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Random/default.aspx">Random</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Shuffle/default.aspx">Shuffle</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Any/default.aspx">Any</category></item><item><title>Alles var – oder nicht?</title><link>http://www.aspnetzone.de/blogs/peterbucher/archive/2009/09/01/alles-var-oder-nicht.aspx</link><pubDate>Tue, 01 Sep 2009 07:37:00 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:212562</guid><dc:creator>Peter Bucher</dc:creator><slash:comments>6</slash:comments><comments>http://www.aspnetzone.de/blogs/peterbucher/comments/212562.aspx</comments><wfw:commentRss>http://www.aspnetzone.de/blogs/peterbucher/commentrss.aspx?PostID=212562</wfw:commentRss><description>&lt;P&gt;Am 13. Oktober 2008 haben &lt;A href="http://www.des-eisbaeren-blog.de/"&gt;Golo Roden&lt;/A&gt; und ich unter dem Titel &lt;A href="http://www.aspnetzone.de/blogs/peterbucher/archive/2008/10/13/noch-fragen-roden-ja-bucher.aspx"&gt;Noch Fragen, Roden? Ja, Bucher!&lt;/A&gt; angekündigt, jeweils zum ersten eines jeden Monats einen Kommentar zu einem vorab gemeinsam gewählten Thema verfassen zu wollen. Bisher sind in dieser Reihe folgende Kommentare erschienen: &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;1. August 2009: &lt;A href="http://www.aspnetzone.de/blogs/peterbucher/archive/2009/08/01/c-oder-vb-welche-sprache-soll-ich-lernen.aspx"&gt;C# oder VB: Welche Sprache soll ich lernen?&lt;/A&gt; 
&lt;LI&gt;1. Juli 2009: &lt;A href="http://www.aspnetzone.de/blogs/peterbucher/archive/2009/07/01/prim-rschl-ssel-guid-vs-identity.aspx"&gt;Primärschlüssel: GUID vs Identity&lt;/A&gt; 
&lt;LI&gt;1. Juni 2009: &lt;A href="http://www.aspnetzone.de/blogs/peterbucher/archive/2009/06/01/heisst-die-zukunft-ria.aspx"&gt;Heißt die Zukunft RIA?&lt;/A&gt; 
&lt;LI&gt;1. Mai 2009: &lt;A href="http://www.aspnetzone.de/blogs/peterbucher/archive/2009/05/01/woran-erkennt-man-einen-guten-entwickler.aspx"&gt;Woran erkennt man einen guten Entwickler?&lt;/A&gt; 
&lt;LI&gt;1. April 2009: &lt;A href="http://www.aspnetzone.de/blogs/peterbucher/archive/2009/04/01/interfaces-vs-abstrakte-klassen.aspx"&gt;Interfaces vs abstrakte Klassen&lt;/A&gt; 
&lt;LI&gt;1. März 2009: &lt;A href="http://www.aspnetzone.de/blogs/peterbucher/archive/2009/03/01/sinn-und-zweck-von-aop.aspx"&gt;Sinn und Zweck von AOP&lt;/A&gt; 
&lt;LI&gt;1. Februar 2009: &lt;A href="http://www.aspnetzone.de/blogs/peterbucher/archive/2009/02/01/die-forderung-nach-softwarequalit-t.aspx"&gt;Die Forderung nach Softwarequalität&lt;/A&gt; 
&lt;LI&gt;1. Januar 2009: &lt;A href="http://www.aspnetzone.de/blogs/peterbucher/archive/2009/01/01/soa-vs-woa.aspx"&gt;SOA vs WOA&lt;/A&gt; 
&lt;LI&gt;1. Dezember 2008: &lt;A href="http://www.aspnetzone.de/blogs/peterbucher/archive/2008/12/01/dynamic-language-runtime-net-quo-vadis.aspx"&gt;Dynamic Language Runtime: .NET, quo vadis?&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Heute, am 1. September 2009, ist es nun wieder so weit, und unser Thema für diesen Monat lautet: &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;Alles var – oder nicht?&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;So wohl Golo wie auch ich haben uns unabhängig voneinander im Vorfeld unsere Gedanken gemacht, wie wir diesem Thema gegenüberstehen. &lt;A href="http://www.des-eisbaeren-blog.de/post/2009/09/01/Alles-var-e28093-oder-nicht.aspx"&gt;Golos Kommentar&lt;/A&gt; findet sich zeitgleich in seinem Blog, folgend nun mein Kommentar zu diesem Thema:&lt;/P&gt;
&lt;P&gt;Nein, werter Leser, das ist &lt;EM&gt;kein&lt;/EM&gt; Rechtschreibefehler, das ist eine wirklich &lt;STRIKE&gt;v&lt;/STRIKE&gt;wa(h)re Geschichte. &lt;BR&gt;Scherz beiseite, los gehts… ;-)&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Einleitung&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Mit C# 3.0 kam ein neues Schlüsselwort names &lt;A href="http://msdn.microsoft.com/de-de/library/bb383973.aspx"&gt;var&lt;/A&gt; hinzu, nur was hat es damit auf sich?&lt;/P&gt;
&lt;P&gt;Es handelt sich dabei weder um ein spät gebundenen noch um einen Variant Typ, wie man ihn bspw. von Scriptsprachen her kennt, sondern um ein Feature das erst die Nutzung von anonymen Typen möglich macht.&lt;/P&gt;
&lt;P&gt;Einfach gesagt heisst das, dass der Compiler den Typ auf der linken Seite vom Ausdruck auf der rechten Seite ableitet. &lt;BR&gt;Also sind die Variablen immer stark typisiert und zwar zur Kompilezeit, nicht erst zur Laufzeit.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Was ist der Sinn des ganzen, bzw. wieso wurde dieses Feature integriert?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Im Zuge der Entwicklung von LINQ wurden die anonymen Typen eingefügt um eine Projektion der Daten auf irgendeine Objektstruktur zu ermöglichen, ohne dazu immer wieder neue Datenhaltungsklassen erstellen zu müssen.&lt;/P&gt;
&lt;P&gt;Damit ist dann bspw. sowas möglich:&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;List&amp;lt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt;&amp;gt; data &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt;&amp;gt; &lt;br /&gt;{ &lt;br /&gt;  &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Patrick:24"&lt;/span&gt;, &lt;br /&gt;  &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Stefan:16"&lt;/span&gt;, &lt;br /&gt;  &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Jörg:22"&lt;/span&gt; &lt;br /&gt;}; &lt;br /&gt;&lt;br /&gt;var persons &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; from dataEntry &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;in&lt;/span&gt; data &lt;br /&gt;              let splitted &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; dataEntry.Split(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt;[] { ':' }) &lt;br /&gt;              select &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; &lt;br /&gt;              { &lt;br /&gt;                Name &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; splitted[0], &lt;br /&gt;                Age &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;int&lt;/span&gt;.Parse(splitted[1]) &lt;br /&gt;              }; &lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;foreach&lt;/span&gt; (var person &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;in&lt;/span&gt; persons) &lt;br /&gt;{ &lt;br /&gt;  Console.WriteLine(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Name: {0}, Age: {1}"&lt;/span&gt;, person.Name, person.Age); &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Dabei ist der Typ von &lt;EM&gt;persons&lt;/EM&gt; &lt;A href="http://msdn.microsoft.com/de-de/library/9eekhta0.aspx"&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/A&gt; wobei T in Visual Studio als "a” für Anonymous gekennzeichnet wird. &lt;BR&gt;Und dementsprechend ist jeder Eintrag in dieser durchlaufbaren Menge ein anonymer Typ, der im Hintergrund vom Kompiler generiert und bereitgestellt wird.&lt;/P&gt;
&lt;P&gt;Die Eigenschaft “Name” ist – wer hätte es gedacht – vom Typ string und “Age” vom Datentyp &lt;A href="http://msdn.microsoft.com/de-de/library/5kzh1b5w(VS.80).aspx"&gt;int&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Wo kann &lt;EM&gt;var&lt;/EM&gt; überall eingesetzt werden?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Das Schlüsselwort kann nur für lokale Variablen genutzt werden, so sind automatisch auch anonyme Typen nur in diesem Bereich nutzbar. D.h. es können auch keine anonymen Typen über Methodengrenzen hinaus übergeben werden.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Wo macht es Sinn var einzusetzen und wann ist ein var mehr zuviel?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Das ist eine spannende Frage und eigentlich der Kernpunkt dieses Streitgespräches. &lt;BR&gt;Hier einfach mal ein paar Beispiele:&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;private&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; SetProperties() &lt;br /&gt;{ &lt;br /&gt;  var collectionMapping &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;this&lt;/span&gt;.CollectionMapping; &lt;br /&gt;&lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;if&lt;/span&gt;(collectionMapping.Count() &amp;gt; 0) &lt;br /&gt;  { &lt;br /&gt;    collectionMapping.Clear(); &lt;br /&gt;  } &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;private&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; SetProperties() &lt;br /&gt;{ &lt;br /&gt;  ICollectionMapping collectionMapping &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;this&lt;/span&gt;.CollectionMapping; &lt;br /&gt;&lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;if&lt;/span&gt;(collectionMapping.Count() &amp;gt; 0) &lt;br /&gt;  { &lt;br /&gt;    collectionMapping.Clear(); &lt;br /&gt;  } &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;static&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; RegisterType() &lt;br /&gt;{ &lt;br /&gt;    var objectToXElement &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; BuildObjectToXElementFunc&amp;lt;TEntity&amp;gt;(); &lt;br /&gt;    var xElementToObject &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; BuildXElementToObjectFunc&amp;lt;TEntity&amp;gt;(); &lt;br /&gt;&lt;br /&gt;    RegisterType(objectToXElement, xElementToObject); &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;static&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; RegisterType() &lt;br /&gt;{ &lt;br /&gt;    Func&amp;lt;TEntity, XElement&amp;gt; objectToXElement &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; BuildObjectToXElementFunc&amp;lt;TEntity&amp;gt;(); &lt;br /&gt;    Func&amp;lt;XElement, TEntity&amp;gt; xElementToObject &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; BuildXElementToObjectFunc&amp;lt;TEntity&amp;gt;(); &lt;br /&gt;&lt;br /&gt;    RegisterType(objectToXElement, xElementToObject); &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;oder sowas: &lt;BR&gt;&lt;BR&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;var wtf &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; GetPattern();&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;vs&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;Pattern pattern &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; GetPattern();&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;In der ersten Methode wird var benutzt und in der folgenden dann nicht mehr. &lt;BR&gt;Ich habe die Beispiele extra so gewählt, denn wenn in diesen Methoden var benutzt wird, sieht man auf den ersten Blick (ohne die Maus zu benutzen, oder einen verrenkten Shortcut) nicht, um was für einen Typen es sich hier handelt.&lt;/P&gt;
&lt;P&gt;Und das ist natürlich ein sehr wichtiger Aspekt. &lt;BR&gt;Denn was nützt mir das weniger schreiben und weniger Code, wenn ich beim lesen – was übrigens vom Zeitaufwand deutlich mehr ist als das Schreiben – nicht mehr auf den ersten Blick erkennen kann, was für Typen das sind.&lt;/P&gt;
&lt;P&gt;Man sollte das Schlüsselwort im Regelfall wirklich &lt;U&gt;nur einsetzen um die anonymen Typen benutzen zu können&lt;/U&gt;.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Ausnahme wenn es sich um eine lange Typdefinition handelt _und_ initialisiert wird&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Ich für meinen Teil halte es so, das ich es eben dann benutze und zusätzlich auch noch in Fällen bei denen die Initialisierung (nicht Zuweisung) rechts daneben steht.&lt;/P&gt;
&lt;P&gt;Und das auch nur wenn es sich um eine lange und komplexere Typbezeichnung handelt, das sind dann meistens solche mit generischem Typparameter, Beispiel:&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; Foo() &lt;br /&gt;{ &lt;br /&gt;    Dictionary&amp;lt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt;, Person&amp;gt; persons &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt;, Person&amp;gt; {…} &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; Foo() &lt;br /&gt;{ &lt;br /&gt;    var persons &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt;, Person&amp;gt; {…} &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Durch den sprechenden Namen und dadurch das die Initialisierung der Variable und so auch die implizite Zuweisung des Types auf der rechten ist, kann das auch gut gelesen werden und ist praktikabel finde ich.&lt;/P&gt;
&lt;P&gt;Diese Anwendung hilft auch Redundanzen zu vermeiden. Wenn man bspw. die Initialisierung änderet ist der Typ auch automatisch angepasst. &lt;BR&gt;Das ist ein netter Nebeneffekt, kann aber auch böse enden, wenn man sich dessen nicht bewusst ist, das Interface gleich ist, aber sich die Methoden / Eigenschaften die später aufgerufen werden, anders verhalten.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Ausnahme wenn es um LINQ Abfragen handelt&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Bei LINQ Abfragen &lt;STRONG&gt;benötigt es &lt;U&gt;kein&lt;/U&gt; var&lt;/STRONG&gt;, wenn keine anonymen Typen genutzt werden. &lt;BR&gt;Allerdings halte ich es auch bei LINQ-Abfragen so, dass ich meistens var benutze. &lt;BR&gt;Denn mit guten Namen und im kleinen Kontext gehalten ist klar und verständlich was rüber kommt. Grösster Vorteil hierbei ist auch die automatische Anpassung des Types.&lt;/P&gt;
&lt;P&gt;Dies kommt in diesem Fall sehr zum Vorschein, denn durch Projektion kann sich der Rückgabetyp schnell ändern, obwohl die Eigenschaften bspw. gleich bleiben.&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; Foo() &lt;br /&gt;{ &lt;br /&gt;    IEnumerable&amp;lt;Person&amp;gt; persons &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; from person &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;in&lt;/span&gt; list.Persons where person.Age &amp;gt; 20 select person; &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; Foo() &lt;br /&gt;{ &lt;br /&gt;    var persons &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; from person &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;in&lt;/span&gt; list.Persons where person.Age &amp;gt; 20 select person; &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Das wars auch schon mit den Ausnahmen. Alles andere ist in meinen Augen nicht mehr lesbar und auch nicht gerechtfertigt. &lt;BR&gt;Ich finde es schon ein wenig beängstigend, wenn ich im Web (Auch von Microsoft) Beispiele sehen, die Zahlen und Zeichenfolgen in 20, 30 Zeilen nur mit var arbeiten. &lt;BR&gt;Wenn die Variablennamen dann noch schlecht gewählt, gute Nacht.&lt;/P&gt;
&lt;P&gt;Was denkt ihr über die Sache und vorallem über meine genannten Ausnahmen?&lt;/P&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=212562" width="1" height="1"&gt;</description><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Tipps/default.aspx">Tipps</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/.NET%203.5/default.aspx">.NET 3.5</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Streitgespr_26002300_228_3B00_ch/default.aspx">Streitgespr&amp;#228;ch</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/var/default.aspx">var</category></item><item><title>Shortcut für das kompilieren des aktuell selektierten Projekts erstellen</title><link>http://www.aspnetzone.de/blogs/peterbucher/archive/2009/07/06/shortcut-f-r-das-kompilieren-des-aktuell-selektierten-projekts-erstellen.aspx</link><pubDate>Mon, 06 Jul 2009 18:02:35 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:211158</guid><dc:creator>Peter Bucher</dc:creator><slash:comments>4</slash:comments><comments>http://www.aspnetzone.de/blogs/peterbucher/comments/211158.aspx</comments><wfw:commentRss>http://www.aspnetzone.de/blogs/peterbucher/commentrss.aspx?PostID=211158</wfw:commentRss><description>&lt;p&gt;Es gibt den Short-Cut CTRL-SHIFT-B um das die aktuelle Solution zu kompilieren.    &lt;br /&gt;Ein Shortcut um das aktuell selektierte Projekt zu kompilieren gibt es standardmässig leider nicht, das lässt sich aber leicht ändern und ist super praktisch.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Tools –&amp;gt; Options –&amp;gt; Keyboard –&amp;gt; Build.BuildSelection auswählen und einen Shortcut vergeben.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Nicht vergessen den Shortcut per “Assign” oder “Zuweisen” auch wirklich zuzuweisen.    &lt;br /&gt;Wenn der Shortcut im Menü angezeigt wird, funktioniert er auch. Ein Neustart von Visual Studio ist nicht nötig.&lt;/p&gt;  &lt;p&gt;Mehr zu Shortcuts gibts ausserdem in einem älteren Blogpost: &lt;a href="http://www.aspnetzone.de/blogs/peterbucher/archive/2008/06/13/mausfrei-f-r-eine-woche-oder-home-end-und-konsorten.aspx"&gt;Mausfrei für eine Woche, oder: Home, End und Konsorten&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=211158" width="1" height="1"&gt;</description><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Visual%20Studio/default.aspx">Visual Studio</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Tipps/default.aspx">Tipps</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Tastatur/default.aspx">Tastatur</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Shortcut/default.aspx">Shortcut</category></item><item><title>SqlServer: User or role already exists in the current database</title><link>http://www.aspnetzone.de/blogs/peterbucher/archive/2009/07/03/sqlserver-user-or-role-already-exists-in-the-current-database.aspx</link><pubDate>Fri, 03 Jul 2009 17:50:00 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:211122</guid><dc:creator>Peter Bucher</dc:creator><slash:comments>0</slash:comments><comments>http://www.aspnetzone.de/blogs/peterbucher/comments/211122.aspx</comments><wfw:commentRss>http://www.aspnetzone.de/blogs/peterbucher/commentrss.aspx?PostID=211122</wfw:commentRss><description>&lt;P&gt;Wenn ein Backup von einer SqlServer-Datenbank zurückgespielt wird kann es sein, das anschliessend für die vorher berechtigten Benutzer das Login fehlschlägt.&lt;BR&gt;Im Sql Management Studio kann unter der Funktion "UserMapping"&amp;nbsp; die Berechtigung im Normalfall wieder zugewiesen werden, jedoch kann es eben in diesem Fall zum Fehler 15023 kommen.&lt;/P&gt;
&lt;P&gt;Für mehr Details zu diesem Fehler siehe &lt;A href="http://blog.falafel.com/ct.ashx?id=2c653d2a-846a-4436-a8ef-9c7485b699fc&amp;amp;url=http%3a%2f%2fsupport.microsoft.com%2fkb%2f246133"&gt;hier&lt;/A&gt; und &lt;A href="http://blog.falafel.com/ct.ashx?id=2c653d2a-846a-4436-a8ef-9c7485b699fc&amp;amp;url=http%3a%2f%2fsupport.microsoft.com%2fkb%2f240872"&gt;hier&lt;/A&gt;, wie man den Fehler beheben kann findet sich in &lt;A href="http://blog.falafel.com/2007/07/14/Error15023UserOrRoleAlreadyExistsInTheCurrentDatabase.aspx"&gt;diesem&lt;/A&gt;&amp;nbsp;und &lt;A href="http://blog.sqlauthority.com/2007/02/15/sql-server-fix-error-15023-user-already-exists-in-current-database/"&gt;diesem&lt;/A&gt;&amp;nbsp;Blogpost.&lt;/P&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=211122" width="1" height="1"&gt;</description><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Tipps/default.aspx">Tipps</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/SqlServer/default.aspx">SqlServer</category></item><item><title>MSDN Webcastserie zur pragmatischen Webarchitektur mit ASP.NET 3.5</title><link>http://www.aspnetzone.de/blogs/peterbucher/archive/2009/07/02/msdn-webcastserie-zur-pragmatischen-webarchitektur-mit-asp-net-3-5.aspx</link><pubDate>Thu, 02 Jul 2009 21:00:54 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:211096</guid><dc:creator>Peter Bucher</dc:creator><slash:comments>1</slash:comments><comments>http://www.aspnetzone.de/blogs/peterbucher/comments/211096.aspx</comments><wfw:commentRss>http://www.aspnetzone.de/blogs/peterbucher/commentrss.aspx?PostID=211096</wfw:commentRss><description>&lt;p&gt;Auf MSDN ist eine neue Ausgabe vom PWA (Pragmatic Web Architecture) von &lt;a href="http://www.codezone.de/DetailPage.Codezone?GUID=ff90975c-32f5-414a-8611-b81c524c177a"&gt;Patrick A. Lorenz&lt;/a&gt; erschienen, das ASP.NET 3.5 fokusiert.&lt;/p&gt;  &lt;p&gt;Ich finde das Konzept gut gelungen und die vorherige Ausgabe der Webcast-Serie (Aus dem Jahre 2006) war sehr gut gemacht. Darum empfehlen ich allen die sich für eine pragmatische Architektur mit ASP.NET interessieren, da reinzuschauen.&lt;/p&gt;  &lt;p&gt;Zitat:&lt;/p&gt;  &lt;div class="Quotes"&gt;Grundkonzept von PWA ist eine dem Projekt angepasste, flexibel erweiterbare Architektur für Web-Applikation. Seit über sechs Jahren kommt PWA nicht nur bei der PGK sondern auch vielen anderen Unternehmen erfolgreich zum Einsatz. Bereits 2006 wurde das Konzept mit einer umfangreichen Webcast-Serie, Artikeln und Vorträgen vorgestellt. Mit .NET hat sich auch PWA über zeit verändert. Die neue Webcast-Serie stellt PWA basierend auf ASP.NET 3.5 SP 1 und mit einer neuen Beispielapplikation vor.&lt;/div&gt;  &lt;p&gt;Die Webcasts und Quelltexte können direkt von der Firmen-Webseite von Patrick heruntergeladen werden.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.pgk.de/news/2009-06-24_pwa.aspx"&gt;Neue MSDN Webcast-Serie zu ASP.NET Architektur (Webcasts und Quelltexte)&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=211096" width="1" height="1"&gt;</description><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Tipps/default.aspx">Tipps</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Architektur/default.aspx">Architektur</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/WebCast/default.aspx">WebCast</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/PWA/default.aspx">PWA</category></item><item><title>Optimierungseinstellung im Reflector, oder: Wie sieht LINQ wirklich aus?</title><link>http://www.aspnetzone.de/blogs/peterbucher/archive/2009/06/08/optimierungseinstellung-im-reflector-oder-wie-sieht-linq-wirklich-aus.aspx</link><pubDate>Mon, 08 Jun 2009 18:24:00 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:210630</guid><dc:creator>Peter Bucher</dc:creator><slash:comments>6</slash:comments><comments>http://www.aspnetzone.de/blogs/peterbucher/comments/210630.aspx</comments><wfw:commentRss>http://www.aspnetzone.de/blogs/peterbucher/commentrss.aspx?PostID=210630</wfw:commentRss><description>&lt;P&gt;Beim &lt;A href="http://www.dotnetkk.de/Appointments/Details/dritter-net-stammtisch-konstanz-kreuzlingen"&gt;dritten&lt;/A&gt; Treffen vom &lt;A href="http://www.dotnetkk.de/"&gt;.NET Stammtisch Konstanz - Kreuzlingen&lt;/A&gt; habe ich einen Vortrag über &lt;A href="http://de.wikipedia.org/wiki/LINQ"&gt;LINQ&lt;/A&gt; gehalten. &lt;BR&gt;Dabei wollte ich zeigen wie aus dem SQL ähnlichen Syntax von LINQ aneinandergereihte Methoden Aufrufe werden und aus den &lt;A href="http://msdn.microsoft.com/de-de/library/bb397687.aspx"&gt;Lambda Ausdrücken&lt;/A&gt; jeweils anonyme Methoden.&lt;/P&gt;
&lt;P&gt;Das geht über den &lt;A href="http://www.red-gate.com/products/reflector/"&gt;Reflector&lt;/A&gt; auch wunderbar. Kurz vor dem Vortrag habe ich den Fehler begangen und Windows 7 installiert… nicht das Windows 7 der Fehler gewesen wäre, sondern die Neuinstallation. &lt;BR&gt;So hatte ich vieles noch nicht 100% so wie es war und ausserdem war plötzlich die neuste Version vom Reflector installiert.&lt;/P&gt;
&lt;P&gt;Als ich während dem Vortrag den Code demonstrieren wollte, bekamen wir natürlich nur wunderschöne Lambda-Ausdrücke zu sehen, keine anonymen Methoden. Ich wusste nicht wieso und hatte keine Zeit das herauszufinden.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Edit:&lt;/STRONG&gt;&lt;BR&gt;LINQ war das natürlich nicht, sondern nur Lambda-Ausdrücke.&lt;BR&gt;Jedoch gilt das genau so für LINQ, dort wird die LINQ-Syntax automatisch vom Kompiler&amp;nbsp;in den Erweiterungemethoden-Syntax + Lambda-Ausdrücke umgewandelt.&lt;BR&gt;Natürlich kann auch von Hand der Erweiterungsmethoden-Syntax benutzt werden, bei einer Bedingung oder wirklich komplexen Aufgaben ist das meist angenehmer.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;LINQ-Syntax&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; Download GetDownloadByFileName(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; fileName) &lt;br /&gt;{ &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;return&lt;/span&gt; (from download &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;in&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;this&lt;/span&gt;.GetList()&lt;br /&gt;                  where download.FileName == fileName).SingleOrDefault();&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Erweiterungsmethoden-Syntax&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; Download GetDownloadByFileName(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; fileName) &lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;return&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;this&lt;/span&gt;.GetList().Where(download =&amp;gt; download.FileName == fileName);&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;.NET 3.5&lt;/STRONG&gt; &lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; Download GetDownloadByFileName(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; fileName) &lt;br /&gt;{ &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;return&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;this&lt;/span&gt;.GetList(d =&amp;gt; d.FileName == fileName).SingleOrDefault(); &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Eigentlich ist es relativ einfach, man gehe im Menü unter: &lt;EM&gt;View –&amp;gt; Options –&amp;gt; Disassembler&lt;/EM&gt; und stellt bei &lt;EM&gt;Optimization&lt;/EM&gt; &lt;STRONG&gt;.NET 2.0&lt;/STRONG&gt; ein, dann sieht es nämlich so aus:&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; Download GetDownloadByFileName(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; fileName)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;return&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;this&lt;/span&gt;.GetList(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;delegate&lt;/span&gt; (Download d) {&lt;br /&gt;        &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;return&lt;/span&gt; d.FileName == fileName;&lt;br /&gt;    }).SingleOrDefault&amp;lt;Download&amp;gt;();&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Wird &lt;STRONG&gt;None&lt;/STRONG&gt; oder &lt;STRONG&gt;.NET 1.0&lt;/STRONG&gt; eingestellt ist der Code schon fast nicht mehr zu lesen.&lt;BR&gt;Es ist hier gut zu erkennen, was der Kompiler im Hintergrund alles erzeugt damit die oben geschriebene Syntax funktioniert.&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; Download GetDownloadByFileName(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; fileName) &lt;br /&gt;{ &lt;br /&gt;    &amp;lt;&amp;gt;c__DisplayClass1 CS$&amp;lt;&amp;gt;8__locals2; &lt;br /&gt;    Download CS$1$0000; &lt;br /&gt;    CS$&amp;lt;&amp;gt;8__locals2 &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; &amp;lt;&amp;gt;c__DisplayClass1(); &lt;br /&gt;    CS$&amp;lt;&amp;gt;8__locals2.fileName &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; fileName; &lt;br /&gt;    CS$1$0000 &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;this&lt;/span&gt;.GetList(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; Func&amp;lt;Download, &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;bool&lt;/span&gt;&amp;gt;(CS$&amp;lt;&amp;gt;8__locals2.&amp;lt;GetDownloadByFileName&amp;gt;b__0)).SingleOrDefault&amp;lt;Download&amp;gt;(); &lt;br /&gt;Label_0028: &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;return&lt;/span&gt; CS$1$0000; &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Bearbeitung / Korrekturen&lt;/STRONG&gt;:&lt;BR&gt;09.06.09 - Das Codesnippet zu .NET 2.0 war natürlich das falsche, jetzt sieht man auch die anonyme Methode.&lt;BR&gt;09.09.09 - LINQ war ja nicht drin, ist jetzt hinzugefügt ;-)&lt;/P&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=210630" width="1" height="1"&gt;</description><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Tipps/default.aspx">Tipps</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/dotnetkk.de/default.aspx">dotnetkk.de</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Reflector/default.aspx">Reflector</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Lambda/default.aspx">Lambda</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>ASP.NET MVC: Daten zur View Masterpage übergeben</title><link>http://www.aspnetzone.de/blogs/peterbucher/archive/2009/03/28/asp-net-mvc-daten-zur-view-masterpage-bergeben.aspx</link><pubDate>Fri, 27 Mar 2009 23:03:00 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:208955</guid><dc:creator>Peter Bucher</dc:creator><slash:comments>4</slash:comments><comments>http://www.aspnetzone.de/blogs/peterbucher/comments/208955.aspx</comments><wfw:commentRss>http://www.aspnetzone.de/blogs/peterbucher/commentrss.aspx?PostID=208955</wfw:commentRss><description>&lt;P&gt;Ich stand gerade vor der Aufgabe, die UserTimeline eines Twitter Accounts auf einer &lt;A href="http://www.asp.net/mvc/"&gt;ASP.NET MVC&lt;/A&gt; Masterpage anzuzeigen. &lt;BR&gt;Dabei muss die Masterpage irgendwie an die Daten kommen, die sie anzeigen will.&lt;/P&gt;
&lt;P&gt;Eine naive Suche bringt mich mit dem ersten Ergebnis sofort ans Ziel:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A title=http://www.google.com/search?oe=utf8&amp;amp;ie=utf8&amp;amp;source=uds&amp;amp;start=0&amp;amp;hl=de&amp;amp;q=asp.net+mvc+master+%2Bshow+data href="http://www.google.com/search?oe=utf8&amp;amp;ie=utf8&amp;amp;source=uds&amp;amp;start=0&amp;amp;hl=de&amp;amp;q=asp.net+mvc+master+%2Bshow+data"&gt;http://www.google.com/search?oe=utf8&amp;amp;ie=utf8&amp;amp;source=uds&amp;amp;start=0&amp;amp;hl=de&amp;amp;q=asp.net+mvc+master+%2Bshow+data&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;=&amp;gt; &lt;A href="http://www.asp.net/learn/MVC/tutorial-13-cs.aspx"&gt;Passing Data to View Master Pages&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Dort stellen sie zwei Möglichkeiten vor. &lt;BR&gt;Bei der ersten wird vorgeschlagen im Konstruktor jedes Controllers die benötigten Daten in das ViewData-Dictionary zu übergeben. &lt;BR&gt;Das wird natürlich mühsam und bei einer Änderung können alle Controller angefasst werden.&lt;/P&gt;
&lt;P&gt;Die zweite Möglichkeit schlägt einen abstrakten Basiscontroller vor, in dessen Konstruktor das ViewData-Dictionary gefüllt wirde. &lt;BR&gt;Eine gute Lösung und die Änderung findet an einer Stelle statt.&lt;/P&gt;
&lt;P&gt;Alle Controller müssen dann von dem abstrakten Controller erben, dabei wird jedesmal dessen Konstruktor ausgeführt und die Daten übergeben. &lt;BR&gt;Ein solcher Controller könnte bspw. so aussehen: &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;namespace&lt;/span&gt; Netkk.Controllers &lt;br /&gt;{ &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;abstract&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;class&lt;/span&gt; ApplicationController : Controller &lt;br /&gt;    { &lt;br /&gt;        &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; ApplicationController() { &lt;br /&gt;            ITwitterRepository repository &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; TwitterRepository(); &lt;br /&gt;            IEnumerable&amp;lt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt;&amp;gt; formattedTweets &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; repository.GetFormattedUserTimeLine( &lt;br /&gt;                &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"username"&lt;/span&gt;, &lt;br /&gt;                &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"password"&lt;/span&gt;, &lt;br /&gt;                4); &lt;br /&gt;&lt;br /&gt;            ViewData[&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"userTimeLine"&lt;/span&gt;] &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; formattedTweets; &lt;br /&gt;        } &lt;br /&gt;    } &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Und im Masterpage View kann kann über das Dictionary darüber iteriert werden: &lt;BR&gt;&lt;BR&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;% &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;foreach&lt;/span&gt;(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; formattedTweet &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;in&lt;/span&gt; (IEnumerable&amp;lt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt;&amp;gt;)ViewData[&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"userTimeLine"&lt;/span&gt;]) { &lt;br /&gt;       %&amp;gt; &lt;br /&gt;        &amp;lt;p&amp;gt; &lt;br /&gt;            &amp;lt;%= formattedTweet %&amp;gt; &lt;br /&gt;        &amp;lt;/p&amp;gt; &lt;br /&gt;       &amp;lt;% &lt;br /&gt;   } &lt;br /&gt;%&amp;gt; &lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Ist dagegen etwas auszusetzen oder gibt es eine bessere Lösung?&lt;/P&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=208955" width="1" height="1"&gt;</description><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Tipps/default.aspx">Tipps</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Masterpage/default.aspx">Masterpage</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/ASP.NET%20MVC/default.aspx">ASP.NET MVC</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Controller/default.aspx">Controller</category></item><item><title>Schneller finden mit keyboardr.com</title><link>http://www.aspnetzone.de/blogs/peterbucher/archive/2009/01/25/schneller-finden-mit-keyboardr-com.aspx</link><pubDate>Sun, 25 Jan 2009 19:55:00 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:206141</guid><dc:creator>Peter Bucher</dc:creator><slash:comments>0</slash:comments><comments>http://www.aspnetzone.de/blogs/peterbucher/comments/206141.aspx</comments><wfw:commentRss>http://www.aspnetzone.de/blogs/peterbucher/commentrss.aspx?PostID=206141</wfw:commentRss><description>&lt;P&gt;Albert hat es schon &lt;A href="http://der-albert.com/archive/0001/01/01/keyboardr.com-schneller-suchen-geht-kaum.aspx"&gt;geschrieben&lt;/A&gt; und ich versuche es nur auch mal damit :)&lt;/P&gt;
&lt;P&gt;&lt;A title=http://www.keyboardr.com/ href="http://www.keyboardr.com/"&gt;http://www.keyboardr.com/&lt;/A&gt; reagiert sofort bei der Eingabe eines Wortes (oder des nächsten) mit der Suche. &lt;BR&gt;Angezeigt werden Ergebnisse von Google, Google Bilder, Wikipedia und Youtube.&lt;/P&gt;
&lt;P&gt;Über die Pfeiltasten kann innerhalb der Ergebnisse navigiert werden und per Druck auf die Enter Taste kann ein Ergebnis in einem neuen Fenster geöffnet werden und sie Suche ohne Pause weitergehen.&lt;/P&gt;
&lt;P&gt;Bei mir im Moment die Startseite. Mal schauen wie sich das bewährt.&lt;/P&gt;
&lt;P&gt;&lt;STRIKE&gt;ps: Weiss jemand wie man die Suchergebnisse in einem Tab öffnen kann (IE)?&lt;/STRIKE&gt;&lt;/P&gt;
&lt;P&gt;Danke für den Tip &lt;A href="http://der-albert.com/"&gt;Albert&lt;/A&gt;, über die Tab-Einstellungen im IE gehts natürlich wunderbar.&lt;/P&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=206141" width="1" height="1"&gt;</description><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Tipps/default.aspx">Tipps</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Google/default.aspx">Google</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/keyboardr/default.aspx">keyboardr</category></item><item><title>Konfiguration per configSource-Attribut auslagern</title><link>http://www.aspnetzone.de/blogs/peterbucher/archive/2009/01/22/konfiguration-per-configsource-attribut-auslagern.aspx</link><pubDate>Thu, 22 Jan 2009 18:18:00 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:206065</guid><dc:creator>Peter Bucher</dc:creator><slash:comments>0</slash:comments><comments>http://www.aspnetzone.de/blogs/peterbucher/comments/206065.aspx</comments><wfw:commentRss>http://www.aspnetzone.de/blogs/peterbucher/commentrss.aspx?PostID=206065</wfw:commentRss><description>&lt;P&gt;Eine web.config- oder app.config-Datei kann mit der Zeit ziemlich gross und unübersichtlich werden. &lt;BR&gt;.NET bietet hierfür aber eine Lösung per &lt;A href="http://msdn.microsoft.com/de-de/library/ms228167.aspx"&gt;configSource-Attribut&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Ein normaler Konfigurationsabschnitt für HttpHandlers sieht so aus:&lt;/P&gt;
&lt;DIV class=CodeBox&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt; […] &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;httpHandlers&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;add&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;verb&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="GET"&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;path&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="Download.axd"&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;type&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="Project.Downloads.DownloadHandlerFactory"&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;httpHandlers&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;[…] &lt;/span&gt;&lt;/code&gt; &lt;/DIV&gt;
&lt;P&gt;Wenn dieser Teil ausgelagert werden will, reicht dann diese Notation in der web.config:&lt;/P&gt;
&lt;DIV class=CodeBox&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;httpHandlers&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;configSource&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="Configuration\HttpHandler.config"&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/DIV&gt;
&lt;P&gt;Die HttpHandler.config in einem Verzeichnis oberhalb des Roots sieht dann bspw. so aus:&lt;/P&gt;
&lt;DIV class=CodeBox&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;httpHandlers&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;add&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;verb&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="GET"&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;path&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="Download.axd"&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;type&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="Project.Downloads.DownloadHandlerFactory"&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;httpHandlers&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/DIV&gt;
&lt;P&gt;Für eigene Konfigurationsabschnitte kann genau gleich vorgegangen werden. &lt;BR&gt;Zusätzlich gibt es da noch die Möglichkeit per &lt;A href="http://msdn.microsoft.com/de-de/library/ms228057(VS.80).aspx"&gt;restartOnExternalChanges-Attribut&lt;/A&gt; das auf &lt;STRONG&gt;false&lt;/STRONG&gt; gesetzt ist und innerhalb der &amp;lt;configSections&amp;gt;&amp;lt;section …. platziert werden muss, festgelegt werden ob die Applikation neu starten soll wenn die externe Konfigurationsdatei geändert wurde.&lt;/P&gt;
&lt;P&gt;Das ist eine gute Möglichkeit per Laufzeit Einstellungen zu wechseln. &lt;BR&gt;Jedoch sollte man abschätzen wie kritisch die Änderungen sind und ob der Zugriff darauf die Applikation in einen undefinierten Zustand bringen könnten. &lt;BR&gt;Um das zu verhindern, müsste ggf. ein Locking-Mechanismus implementiert werden.&lt;/P&gt;
&lt;P&gt;Die möglichen Vorteile bei der Nutzung dieser Möglichkeit:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Bessere Übersichtlichkeit 
&lt;LI&gt;Ermöglicht einfaches Austauschen von Teilen der Konfiguration (Bspw. Developer- und Productivemaschinen haben verschiedene Connectionstrings) 
&lt;LI&gt;Gibt die Möglichkeit Änderungen während der Laufzeit auszuführen &lt;/LI&gt;&lt;/UL&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=206065" width="1" height="1"&gt;</description><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Tipps/default.aspx">Tipps</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/web_2E00_config/default.aspx">web.config</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Konfiguration/default.aspx">Konfiguration</category></item><item><title>Unbekanntes Visual Studio Feature: Gleiche Datei doppelt in der Editoransicht darstellen</title><link>http://www.aspnetzone.de/blogs/peterbucher/archive/2009/01/22/unbekanntes-visual-studio-feature-gleiche-datei-doppelt-in-der-editoransicht-darstellen.aspx</link><pubDate>Thu, 22 Jan 2009 17:49:18 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:206063</guid><dc:creator>Peter Bucher</dc:creator><slash:comments>3</slash:comments><comments>http://www.aspnetzone.de/blogs/peterbucher/comments/206063.aspx</comments><wfw:commentRss>http://www.aspnetzone.de/blogs/peterbucher/commentrss.aspx?PostID=206063</wfw:commentRss><description>&lt;p&gt;Visual Studio überrascht immer wieder aufs neue, so ist es mir heute ergangen.    &lt;br /&gt;Wenn innerhalb einer Datei zwei Stellen verglichen werden müssen, ist es mühsam immer von oben nach unten und vice versa zu scrollen.&lt;/p&gt;  &lt;p&gt;Um das zu vermeiden gibt es einen einfachen Trick, oberhalb der vertikalen Scrolleiste hat es ein kleines Viereck das mit der Maus nach unte gezogen werden kann.&lt;/p&gt;  &lt;p&gt;Die Benutzung:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.aspnetzone.de/blogs/peterbucher/notopen_5E27CF74.jpg"&gt;&lt;img title="notopen" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="329" alt="notopen" src="http://www.aspnetzone.de/blogs/peterbucher/notopen_thumb_6AB57C90.jpg" width="452" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Das Resultat:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.aspnetzone.de/blogs/peterbucher/open_1A23EB5D.jpg"&gt;&lt;img title="open" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="329" alt="open" src="http://www.aspnetzone.de/blogs/peterbucher/open_thumb_3D9069F5.jpg" width="452" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=206063" width="1" height="1"&gt;</description><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Visual%20Studio/default.aspx">Visual Studio</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Tipps/default.aspx">Tipps</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Visual%20Studio%202008/default.aspx">Visual Studio 2008</category></item><item><title>Typkonvertierung vereinfacht, oder: &lt;Value&gt;.ToOrDefault&lt;Type&gt;();</title><link>http://www.aspnetzone.de/blogs/peterbucher/archive/2008/12/08/typkonvertierung-vereinfacht-oder-value-to-type.aspx</link><pubDate>Mon, 08 Dec 2008 20:29:00 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:204828</guid><dc:creator>Peter Bucher</dc:creator><slash:comments>4</slash:comments><comments>http://www.aspnetzone.de/blogs/peterbucher/comments/204828.aspx</comments><wfw:commentRss>http://www.aspnetzone.de/blogs/peterbucher/commentrss.aspx?PostID=204828</wfw:commentRss><description>&lt;DIV class=Quotes&gt;
&lt;P&gt;&lt;STRONG&gt;*Update&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Im Zuge meiner Arbeit an der &lt;A href="http://www.aspnetzone.de/blogs/peterbucher/archive/2008/12/09/facade-pattern-und-ein-anwendungsbeispiel-sessionfacade.aspx"&gt;SessionFacade&lt;/A&gt; ging mir das Licht auf, dass wir es im Optimalfall mit relativ wenigen Session-Variablen zu tun haben und über eine SessionFacade auch einen einfachen typisierten Zugriff gewähren können.&lt;BR&gt;Zudem finden wir in der Session im Normalfall nur geboxte Typen, die mit einem einfachen &lt;A href="http://www.mycsharp.de/wbb2/thread.php?threadid=28579"&gt;Cast&lt;/A&gt; zu ihrem Urprungstyp gewandelt werden können.&lt;BR&gt;Da die .To-Methoden nur für das Parsen vom Typ String in einen anderen Typen gedacht ist, bringt es nichts bspw. ein geboxter int zu einem String zu wandeln um diesen nochmals zu parsen, wenn ein &lt;A href="http://www.mycsharp.de/wbb2/thread.php?threadid=28579"&gt;Cast&lt;/A&gt; reicht.&lt;/P&gt;
&lt;P&gt;Zudem ist die Angabe von "object" als Zieltyp für eine Extensionmethode nicht sehr gut gewählt, da sie dann bei allen Typen erscheint. Vorallem dann natürlich nicht, wenn es relativ unsinnig ist.&lt;/P&gt;
&lt;P&gt;Im Zuge dieser Erkenntnis habe ich den Zieltyp auf "string" geändert.&lt;BR&gt;Zusätzlich gibt es auch noch die Anforderung bei einem nicht erfolgreifen Parsing auf einen anderen Typen, einen Startwert zu setzen, der vom Standardwert des Typen abweicht.&lt;/P&gt;
&lt;P&gt;Ich habe das Beispiel unten geändert und die Erläuterung plus ein Beispiel für die zweite Überladung mit dem Standardwert hinzugefügt. Viel Spass!&lt;BR&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;Insbesondere bei der Webentwicklung mit .NET haben wir viel mit Eingaben als Strings zu tun. &lt;BR&gt;Diese müssen dann in int, DateTime, double, Guid, etc... konvertiert werden.&lt;/P&gt;
&lt;P&gt;.NET bietet dabei &amp;lt;Type&amp;gt;.Parse()- / &amp;lt;Type&amp;gt;.TryParse()- oder ConvertTo&amp;lt;Type&amp;gt;-Methoden an.&lt;/P&gt;
&lt;P&gt;Hierbei gilt die Empfehlung &amp;lt;Type&amp;gt;.TryParse() zu verwenden um auf eine nicht mögliche Konvertierung aufgrund von Nullwerten oder ungültigen Werten zu reagieren.&lt;/P&gt;
&lt;P&gt;Die ganze Geschichte gibt aber viel sich immer wiederholende Schreibarbeit, ein Extrembeispiel der Konvertierung eines Strings&amp;nbsp;(Oder null-Literal!) aus einer&amp;nbsp;GET-Parameter Abfrage&amp;nbsp;zu einem int könnte mit &amp;lt;Type&amp;gt;.TryParse() so aussehen:&lt;/P&gt;
&lt;DIV class=CodeBox&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; value &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; Request.QueryString[&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"index"&lt;/span&gt;]; &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Kann auch das Literal "null" darstellen &lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;int&lt;/span&gt; typedValue;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;if&lt;/span&gt;(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;int&lt;/span&gt;.TryParse(value, &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;out&lt;/span&gt; typedValue) &amp;amp;&amp;amp; typedValue == 4) { &lt;br /&gt;    lblStatus.Text &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Wert gültig: {0}"&lt;/span&gt;, typedValue); &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt; &lt;/DIV&gt;
&lt;P&gt;Für eine Konvertierung, die so häufig vorkommt ist das mir - auch aufgrund von anderen Überlegungen - viel zu viel Schreibarbeit. &lt;BR&gt;Ich stelle mir sowas vor:&lt;/P&gt;
&lt;DIV class=CodeBox&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;int&lt;/span&gt; typedValue &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; Request.QueryString[&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"index"&lt;/span&gt;].ToOrDefault&amp;lt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;int&lt;/span&gt;&amp;gt;();&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;if&lt;/span&gt;(typedValue == 4) { &lt;br /&gt;    lblStatus.Text &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Wert gültig: {0}"&lt;/span&gt;, typedValue); &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt; &lt;/DIV&gt;
&lt;P&gt;Zuerst meine Überlegungen: &lt;BR&gt;Ob eine Konvertierung erfolgreich war, brauche ich nur den Wert zu überprüfen, einen Boolean ob die Konvertierung erfolgreich war, brauche ich nicht. &lt;BR&gt;Bei int reicht mir eine Prüfung auf den Stardardwert 0, bei Guid die Prüfung auf Guid.Empty, bei DateTime entweder DateTime.MinValue. &lt;BR&gt;Sind es boolsche Werte oder kann man / möchte man .MinValue von DateTime nicht benutzen, nimmt man sich Nullable Types zur Hilfe.&lt;/P&gt;
&lt;P&gt;Mehr braucht es meines Erachtens nicht um primitive Typen sowie erweiterte Strukturen zu konvertieren und festzustellen was angekommen ist.&lt;/P&gt;
&lt;P&gt;Ich habe mir dazu eine Methode geschrieben, die nach Wunsch entweder als Extension Method oder als statische Hilfsmethode in einer Tools-Klasse genutzt werden kann. (Das Original ist &lt;A href="http://www.jigar.net/howdoi/viewhtmlcontent319.aspx"&gt;hier&lt;/A&gt; zu finden)&lt;/P&gt;
&lt;P&gt;Die Implementierung:&lt;/P&gt;
&lt;DIV class=CodeBox&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;static&lt;/span&gt; partial &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;class&lt;/span&gt; Common&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/// Gibt ein typisiertes Objekt aus einem String zurück.&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/// Falls die Umwandlung nicht erfolgreich ist, wird stattdessen&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/// der Standardwert des Zieltypen zurückgegeben.&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/// &amp;lt;typeparam name="T"&amp;gt;Zieltyp&amp;lt;/typeparam&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/// &amp;lt;param name="value"&amp;gt;Zu typisierenden String&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/// &amp;lt;param name="defaultValue"&amp;gt;Standardwert (Wird bei Fehlschlag zurückgegeben)&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/// &amp;lt;returns&amp;gt;Typisiertes Objekt&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;static&lt;/span&gt; T ToOrDefault&amp;lt;T&amp;gt;(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;this&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; value, T defaultValue)&lt;br /&gt;    {&lt;br /&gt;      T result &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; defaultValue;&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;if&lt;/span&gt; (value == &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;null&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;return&lt;/span&gt; result;&lt;br /&gt;&lt;br /&gt;      TypeConverter converter &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; TypeDescriptor.GetConverter(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;typeof&lt;/span&gt;(T));&lt;br /&gt;      &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;if&lt;/span&gt; (converter.CanConvertFrom(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;typeof&lt;/span&gt;(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt;)))&lt;br /&gt;      {&lt;br /&gt;        &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;try&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;          result &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; (T)converter.ConvertFrom(value);&lt;br /&gt;        } &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;catch&lt;/span&gt; (Exception) {}&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;return&lt;/span&gt; result;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/// Gibt ein typisiertes Objekt aus einem String zurück.&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/// Falls die Umwandlung nicht erfolgreich ist, wird stattdessen&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/// der Standardwert des Zieltypen zurückgegeben.&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/// &amp;lt;typeparam name="T"&amp;gt;Zieltyp&amp;lt;/typeparam&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/// &amp;lt;param name="value"&amp;gt;Zu typisierenden String&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/// &amp;lt;returns&amp;gt;Typisiertes Objekt&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;static&lt;/span&gt; T ToOrDefault&amp;lt;T&amp;gt;(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;this&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; value) {&lt;br /&gt;        &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;return&lt;/span&gt; value.ToOrDefault&amp;lt;T&amp;gt;(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;default&lt;/span&gt;(T));&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt; &lt;/DIV&gt;
&lt;P&gt;Die Nutzung sieht dann bspw. so aus:&lt;/P&gt;
&lt;DIV class=CodeBox&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Nullable&lt;/span&gt;&lt;br /&gt;DateTime? date &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; Request.QueryString[&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"date"&lt;/span&gt;].ToOrDefault&amp;lt;DateTime?&amp;gt;(); &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;if&lt;/span&gt;(date.HasValue) { &lt;br /&gt;    &amp;lt;meinObjekt&amp;gt;.Date &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; date.Value; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Kein Nullable&lt;/span&gt;&lt;br /&gt;Guid guid &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; Request.Form[&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"userGuid"&lt;/span&gt;].ToOrDefault&amp;lt;Guid&amp;gt;(); &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;if&lt;/span&gt;(guid !&lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; Guid.Empty) &lt;br /&gt;    currentUser &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; User.Load(guid);&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Standardwert&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;int&lt;/span&gt; width &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; Request.QueryString[&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"width"&lt;/span&gt;].ToOrDefault&amp;lt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;int&lt;/span&gt;&amp;gt;(1024);&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// width == 1024 bei erfolglosem Parsing (Wenn bspw. der Parameter null zurückgibt)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// width == 4 bei erfolgreiem Parsing bei einem Eingangsstring von "4"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Oder ohne Angabe des Typparameters (Typ wird implizit durch die Angabe des Standardwertes ermittelt)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;int&lt;/span&gt; height &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; Request.QueryString[&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"height"&lt;/span&gt;].ToOrDefault(768);&lt;/span&gt;&lt;/code&gt; &lt;/DIV&gt;
&lt;P&gt;Diese Methode ist dafür gedacht um Strings oder geboxte Strings (Bspw. ein object das von Session[&amp;lt;Index&amp;gt;] zurückkommt aber ein String enhält in die typisierte Version zu konvertieren. &lt;BR&gt;Double zu int oder eigene Objekte funktionieren nicht, dafür gibt es &lt;A href="http://www.mycsharp.de/wbb2/thread.php?threadid=28579"&gt;Casts&lt;/A&gt; oder man schreibt sich eigene Typekonverter dafür. &lt;BR&gt;Bei normalen Typen (int, string, double, ...) wird bei der Eingabe von null oder ungültigen Strings jeweils der .NET-Standardwert (int = 0, Guid = Guid.Empty, ...) geliefert, bei der Verwendung von Nullable Types kann dann eine Prüfung gegen null benutzt werden.&lt;/P&gt;
&lt;P&gt;Was denkt ihr? &lt;BR&gt;Benutzt die Kommentarfunktion!&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Bearbeitung / Korrekturen&lt;/STRONG&gt;:&lt;BR&gt;17.12.08 - Möglichkeit zur Angabe eines Standardwertes hinzugefügt (Inspiriert durch &lt;A href="http://www.des-eisbaeren-blog.de/"&gt;Golo Roden&lt;/A&gt;)&lt;BR&gt;19.12.08 - Die .To-Methode vereinfacht (Danke an &lt;A href="http://www.des-eisbaeren-blog.de/"&gt;Golo Roden&lt;/A&gt;)&lt;BR&gt;19.12.08&amp;nbsp;- Die Methode von "To()" nach "ToOrDefault()" umbenannt.&lt;/P&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=204828" width="1" height="1"&gt;</description><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Tipps/default.aspx">Tipps</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Artikel/default.aspx">Artikel</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/TryParse/default.aspx">TryParse</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Parse/default.aspx">Parse</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Type/default.aspx">Type</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Typ/default.aspx">Typ</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Konvertierung/default.aspx">Konvertierung</category><category domain="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Convert/default.aspx">Convert</category></item></channel></rss>