<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>.Net &#8211; Karl Jepertinger IT Consulting</title>
	<atom:link href="https://www.jepertinger-itconsulting.de/category/programmierung/net/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.jepertinger-itconsulting.de</link>
	<description>Consultant as a Service!</description>
	<lastBuildDate>Thu, 30 Mar 2017 17:42:17 +0000</lastBuildDate>
	<language>de-DE</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0.1</generator>
	<item>
		<title>Raspberry PI 3 : Mono Installation</title>
		<link>https://www.jepertinger-itconsulting.de/2016/03/29/raspberry-pi-3-mono-installation/</link>
					<comments>https://www.jepertinger-itconsulting.de/2016/03/29/raspberry-pi-3-mono-installation/#comments</comments>
		
		<dc:creator><![CDATA[Karl Jepertinger]]></dc:creator>
		<pubDate>Tue, 29 Mar 2016 07:02:23 +0000</pubDate>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[IOT]]></category>
		<guid isPermaLink="false">http://www.jepertinger-itconsulting.de/?p=660</guid>

					<description><![CDATA[Um auf dem Raspberry mit .Net Apps arbeiten zu können muss zuerst die entsprechende Laufzeitumgebung installiert werden. Unter Linux ist dies die freie Umgebung Mono. Im Vergleich zum Original bringt sie ein paar Einschränkungen mit, die aber bei der Programmierung &#8230; <a href="https://www.jepertinger-itconsulting.de/2016/03/29/raspberry-pi-3-mono-installation/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>Um auf dem Raspberry mit .Net Apps arbeiten zu können muss zuerst die entsprechende Laufzeitumgebung installiert werden. Unter Linux ist dies die freie Umgebung <a href="https://de.wikipedia.org/wiki/Mono_%28Software%29" target="_blank">Mono</a>. Im Vergleich zum Original bringt sie ein paar Einschränkungen mit, die aber bei der Programmierung auf dem Raspi nicht weiter ins Gewicht fallen sollten.</p>
<p>Zur Installation genügt auf dem auf Debian basierenden Raspbian der Aufruf des Paketmanagers auf der Konsole:</p>
<p><em>sudo apt-get install mono-complete</em></p>
<p>Nachdem nun die eigene .Net App auf den Raspy kopiert wurde lässt sie sich einfach starten:</p>
<p><em>mono APP-NAME.exe</em></p>
<p>Grundsätzlich funktioniert die Installation auch über:</p>
<p><em>sudo apt-get install mono</em></p>
<p>Dies produziert dann beim Start  einer eigenen App eine Menge Assembly Not Found Exceptions.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.jepertinger-itconsulting.de/2016/03/29/raspberry-pi-3-mono-installation/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Extension Methods vs. Reflection</title>
		<link>https://www.jepertinger-itconsulting.de/2015/04/21/extension-methods-vs-reflection/</link>
		
		<dc:creator><![CDATA[Karl Jepertinger]]></dc:creator>
		<pubDate>Tue, 21 Apr 2015 09:11:23 +0000</pubDate>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Allgemein]]></category>
		<guid isPermaLink="false">http://www.jepertinger-itconsulting.de/?p=547</guid>

					<description><![CDATA[Reflection bezeichnet (nicht nur im .Net Bereich) die Möglichkeit, zur Laufzeit die Metainformationen einer Anwendung zu nutzen. Fragestellungen wie &#8222;Wieviele Properties hat die Klasse?&#8220; können beantwortet werden, ohne dass die reflektierte Klasse zur Programmierzeit bekannt ist/war. Für die alltägliche Businesslogik &#8230; <a href="https://www.jepertinger-itconsulting.de/2015/04/21/extension-methods-vs-reflection/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>Reflection bezeichnet (nicht nur im .Net Bereich) die Möglichkeit, zur Laufzeit die Metainformationen einer Anwendung zu nutzen. Fragestellungen wie &#8222;Wieviele Properties hat die Klasse?&#8220; können beantwortet werden, ohne dass die reflektierte Klasse zur Programmierzeit bekannt ist/war. Für die alltägliche Businesslogik eignet sich Reflection nur bedingt &#8211;  wohl aber für allerlei Querschnittsaufgaben. Auditing, Logging oder dynamische Oberflächen werden damit möglich.<span id="more-547"></span></p>
<p>Extension Methods wurden mit .Net 3.5 eingeführt und erlauben es einen Type zu erweitern ohne von ihm abzuleiten. So können bequem sogar &#8222;sealed&#8220; Types wie System.String erweitert werden &#8211; z.B. um eigene Substring Funktionen. Eine ebenfalls sehr nützliche Funktionalität ist es (generische) Interfaces mit konkretem Code zu hinterlegen, ohne alle Ableitungen des Interfaces zu überarbeiten zu müssen. Eine Extension Method zu IList erweitert also sofort alle Klassen die darauf aufbauen.</p>
<p>Das alles macht im ersten Moment den Eindruck einer <a title="Mehrfachvererbung in Wikipedia" href="https://de.wikipedia.org/wiki/Mehrfachvererbung" target="_blank">Mehrfachvererbung</a>. Das suggeriert auch Visual Studio, indem es die Extension- mit den Instanz-Methoden zusammen anzeigt:<a href="http://www.jepertinger-itconsulting.de/wp-content/uploads/2015/03/extensionmethod_multipleinheritance_visualstudio.jpg" rel="lightbox-0"><img loading="lazy" class="aligncenter wp-image-554 size-full" src="http://www.jepertinger-itconsulting.de/wp-content/uploads/2015/03/extensionmethod_multipleinheritance_visualstudio.jpg" alt="extensionmethod_multipleinheritance_visualstudio" width="471" height="174" srcset="https://www.jepertinger-itconsulting.de/wp-content/uploads/2015/03/extensionmethod_multipleinheritance_visualstudio.jpg 471w, https://www.jepertinger-itconsulting.de/wp-content/uploads/2015/03/extensionmethod_multipleinheritance_visualstudio-300x111.jpg 300w" sizes="(max-width: 471px) 100vw, 471px" /></a>In Wirklichkeit handelt es sich aber nur um &#8222;<a title="Syntax Sugar in der Wikipedia" href="https://en.wikipedia.org/wiki/Syntactic_sugar" target="_blank">Syntax Sugar</a>&#8222;, also einer reinen Vereinfachung für den Programmierer &#8211; intern sind das verschiedene Klassen.</p>
<p>Das hat mehrere Konsequenzen:</p>
<ul>
<li>Extension Methods können keine Interfaces implementieren</li>
<li>sie können keine abstracten Methoden ausprogrammieren</li>
<li>per Reflection sind Extensions nicht in der eigentlichen Klasse zu finden</li>
</ul>
<p>Der Versuch die Extension auf normalem Wege per Reflection zu finden scheitert:</p>
<pre class="brush: csharp; highlight: [20]; title: ; notranslate">
MethodInfo method = typeof(MyClass)
   .GetType()
   .GetMethod(&quot;ExtensionMethod&quot;);
Assert.IsNotNull(method); //Dieser Test wird scheitern
</pre>
<p>Die gesuchte Methode ist eben nicht im gleichen Typ definiert, sondern in einer beliebigen anderen Klasse.</p>
<p>Um alle Extension Methods zu einer bestimmten Klasse zu finden, ist es notwendig alle Typen der Assembly (oder AppDomain) nach Methoden zu durchsieben die zum gesuchten Type (&#8222;TypeToSearchFor&#8220;) erfüllen:</p>
<pre class="brush: csharp; highlight: [20]; title: ; notranslate">
var methods = TypeToSearchFor.Assembly
  .GetTypes()
  .Where(t =&gt;
       t.CustomAttributes
       .where(a =&gt; a.AttributeType == typeof(ExtensionAttribute))
       .Count() == 1
       )
  .SelectMany(t =&gt; t.GetMethods())
  .Where(m=&gt;m.IsStatic == true)
  .Where(m =&gt; m.GetParameters().Count() != 0)
  .Where(m =&gt; m.GetParameters()[0].ParameterType == TypeToSearchFor)
  ;
</pre>
<p>Als Anhang befindet sich ein <a href="https://www.jepertinger-itconsulting.de/?download=566" title="Testprojekt" rel="nofollow" class="ddownload-link id-566 ext-zip">Testprojekt</a> mit :</p>
<ul>
<li>BeispielKlasse und Extension dazu</li>
<li>TestProjekt mit Reflection zum Suchen der Methoden</li>
<li>ReflectionHelper Klasse zum Suchen aller Extension Methods</li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Codeanalyse &#8211; Einarbeitung in fremden Code</title>
		<link>https://www.jepertinger-itconsulting.de/2014/07/09/codeanalyse-einarbeitung-in-fremden-code/</link>
		
		<dc:creator><![CDATA[Karl Jepertinger]]></dc:creator>
		<pubDate>Wed, 09 Jul 2014 09:18:41 +0000</pubDate>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Programmierung]]></category>
		<guid isPermaLink="false">http://blog.jepertinger-itconsulting.de/?p=154</guid>

					<description><![CDATA[Es gibt wohl kaum eine schwierigere/nervigere Aufgabe als fremden Code zu warten oder weiterzuentwickeln. Gerade wenn es dann angeht Incidents/Changes einzuarbeiten kann das zum Topfschlagen im Minenfeld werden. Also wie am besten die Minen identifizieren? Wie kann ich mich möglichst &#8230; <a href="https://www.jepertinger-itconsulting.de/2014/07/09/codeanalyse-einarbeitung-in-fremden-code/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>Es gibt wohl kaum eine schwierigere/nervigere Aufgabe als fremden Code zu warten oder weiterzuentwickeln.<br />
Gerade wenn es dann angeht Incidents/Changes einzuarbeiten kann das zum Topfschlagen im Minenfeld werden.<br />
Also wie am besten die Minen identifizieren? Wie kann ich mich möglichst schnell in den Code einarbeiten? Wie kann möglichst schnell und umfassend ein Code Review entstehen ?</p>
<p>Ein Ansatz um den Code in Zahlen zu fassen sind Code Metriken&#8230; <span id="more-154"></span>Visual Studio 2010 Team Foundation Edition hat das bereits integriert und liefert auf Knopfdruck eine Auswertung aller bestehenden Klassen und Methoden.</p>
<ul>
<li>Maintainability Index</li>
<li>Cyclomatic Complexity</li>
<li>Depth of Inheritance</li>
<li>ClassCoupling</li>
<li>Lines of Code</li>
</ul>
<p>Aber was hat das nun zur Aussage ?</p>
<p>Von hinten angefangen:</p>
<p><strong>Lines of Code</strong><br />
Das ist wohl das am leichtesten zu verstehende Metrik, und bezeichnet schlicht und ergreifend die Anzahl der Zeilen pro Klasse. Wer hier Klassen findet, die jenseits der 1.000 (oder 10.000 !!??) oder Methoden die jenseits der 100 Zeilen gefunden hat, ist vom Hot Spot des Codes nicht weit entfernt.</p>
<p><strong>Class Coupling</strong><br />
Bezeichnet die Anzahl der Klassen die von dieser Klasse oder Methode referenziert werden. Um so mehr Klassen benutzt werden, um so komplizierter der (Unit-) Test , um so schwerer die Wiederverwendung. Gibt es wenige Objekte die quasi alle anderen Klassen referenzieren ist dies die Implementierung eines <a title="God-Object" href="http://de.wikipedia.org/wiki/Antipattern#Gottobjekt" target="_blank">God-Object-Antipatterns</a>.</p>
<p><strong>Depth of Inheritance</strong><br />
Auch hier gilt, um so mehr Ableitungen, um so schwerer ist es für jemand aussenstehenden sich einzuarbeiten. Mit dieser Metrik konnte ich bisher am wenigstens anfangen, da viele Objekte z.B. für die Peristierung relativ unkritische Basisklassen besitzen.</p>
<p><strong>Cyclomatic Complexity</strong><br />
Salop formuliert, wird bei dieser Metrik die Anzahl der Kontrollstrukturen (if, switch&#8230;) gezählt. Je höher desto schlechter.<br />
Auf die Klasse gesehen ist die Aussagekraft meiner Meinung nach nicht hoch, für die einzelne Methode allerdings um so mehr! Eine Methode mit vielen komplexen, verschachtelten If-Statements macht die Einarbeitung nicht leichter. Gerne wird dieser Code auch mit Antipattern wie Magic Strings kombiniert.<br />
Diese Problematik lässt sich i.d.R. durch bessere Strukturierung des Codes und Objektorientierung vermeiden.</p>
<p><strong>Maintainability Index</strong><br />
&#8230; ist sozusagen das Aggregat aus allen anderen Metriken. Je niedriger desto schlechter.<br />
Visual Studio markiert alles unter 30 als rot. Meiner Erfahrung nach ist die Grenze des Guten schon bei unter 50 erreicht und ein Blick in den Code ist notwendig.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Erste Version von jeperti.IrcLogger released!</title>
		<link>https://www.jepertinger-itconsulting.de/2014/05/06/erste-version-von-jeperti-irclogger-released/</link>
		
		<dc:creator><![CDATA[Karl Jepertinger]]></dc:creator>
		<pubDate>Tue, 06 May 2014 20:25:43 +0000</pubDate>
				<category><![CDATA[.Net]]></category>
		<guid isPermaLink="false">http://blog.jepertinger-itconsulting.de/?p=316</guid>

					<description><![CDATA[Seit gerade eben finden Sie unter Downloads und Services die erste Version meiner Bibliothek &#8222;jeperti.IrcLogger&#8220; die es einer .Net Anwendung in Kombination mit der Microsoft Enterprise Libarary erlaubt Logging Einträge in einen IRC Channel zu schreiben. Erfahren Sie hier mehr darüber &#8230; <a href="https://www.jepertinger-itconsulting.de/2014/05/06/erste-version-von-jeperti-irclogger-released/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>Seit gerade eben finden Sie unter <a title="Downloads und Services" href="http://blog.jepertinger-itconsulting.de/downloads-und-services/">Downloads und Services</a> die erste Version meiner Bibliothek &#8222;jeperti.IrcLogger&#8220; die es einer .Net Anwendung in Kombination mit der Microsoft Enterprise Libarary erlaubt Logging Einträge in einen IRC Channel zu schreiben.</p>
<p>Erfahren Sie <a title="jeperti.IrcLogger" href="http://www.jepertinger-itconsulting.de/jeperti-irclogger/">hier</a> mehr darüber !</p>
<p>Ich freue mich über Ihr Feedback!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Sortieren in Linq</title>
		<link>https://www.jepertinger-itconsulting.de/2011/12/20/sortieren-in-linq/</link>
		
		<dc:creator><![CDATA[Karl Jepertinger]]></dc:creator>
		<pubDate>Tue, 20 Dec 2011 20:59:56 +0000</pubDate>
				<category><![CDATA[.Net]]></category>
		<guid isPermaLink="false">http://blog.jepertinger-itconsulting.de/?p=183</guid>

					<description><![CDATA[Angenommen man möchte eine Liste von Personen sortieren. Die Klasse sieht in etwa wie diese aus: Das Sortieren nach Nachnamen ist noch einfach: Aber was, wenn zwei Personen den gleichen Nachnamen haben? Das ist nicht die Lösung. Die Liste wird &#8230; <a href="https://www.jepertinger-itconsulting.de/2011/12/20/sortieren-in-linq/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>Angenommen man möchte eine Liste von Personen sortieren. Die Klasse sieht in etwa wie diese aus:</p>
<pre class="brush: csharp; highlight: [20]; title: ; notranslate">
public class Person
{
public int ID { get; set; }
public string Vorname { get; set; }
public string Nachname { get; set; }
}
</pre>
<p>Das Sortieren nach Nachnamen ist noch einfach:</p>
<pre class="brush: csharp; highlight: [20]; title: ; notranslate">

List&lt;Person&gt; personen = new List&lt;Person&gt;();
//.......Laden der Liste

personen.OrderBy(p =&gt; p.Nachname);

</pre>
<p>Aber was, wenn zwei Personen den gleichen Nachnamen haben?</p>
<pre class="brush: csharp; highlight: [20]; title: ; notranslate">
personen.OrderBy(p =&gt; p.Nachname).OrderBy(p =&gt; p.Vorname);
</pre>
<p>Das ist nicht die Lösung. Die Liste wird nun nur noch nach Vorname sortiert.</p>
<p>Die Lösung ist die Extension &#8222;ThenBy&#8220;, damit wird nun innerhalb eines Nachnamens nach Vornamen sortiert &#8211; wie gewünscht!</p>
<pre class="brush: csharp; title: ; notranslate">
personen.OrderBy(p =&gt; p.Nachname).ThenBy(p =&gt; p.Vorname);
</pre>
<p>Ich persöhnlich sortiere zum Schluss gerne noch nach etwas syntetischem &#8211; beispielsweise der ID.<br />
Das hat den Vorteil, dass selbst im unmöglichsten Fall (in diesem Beispiel, dass zwei den gleichen Vor- und Nachnamen haben) immer eine definierte Reihenfolge festgelegt ist. Selbst in diesem Fall, erhält der User in der Oberfläche immer eine definierte Reihenfolge. Gerade bei PLinq kann man sich ja auf die Reihenfolge gar nicht mehr verlassen..</p>
<pre class="brush: csharp; title: ; notranslate">
personen.OrderBy(p =&gt; p.Nachname).ThenBy(p =&gt; p.Vorname).ThenBy(p=&gt;p.ID);
</pre>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Cache Api Fehlermeldung: Cache ist nicht verfügbar</title>
		<link>https://www.jepertinger-itconsulting.de/2011/11/22/cache-api-fehlermeldung-cache-ist-nicht-verfugbar/</link>
		
		<dc:creator><![CDATA[Karl Jepertinger]]></dc:creator>
		<pubDate>Tue, 22 Nov 2011 18:22:01 +0000</pubDate>
				<category><![CDATA[.Net]]></category>
		<guid isPermaLink="false">http://blog.jepertinger-itconsulting.de/?p=189</guid>

					<description><![CDATA[Heute habe ich mich mit der CacheApi in ASP.Net beschäftigt. Diese bietet in ASP.Net Seiten ähnlich dem Application oder Session Object die Möglichkeit Werte/Objekte zu speichern, ist hier aber intelligenter und verwirft die Objekte nach einer festgelegten Zeitdauer. Die Intellisense &#8230; <a href="https://www.jepertinger-itconsulting.de/2011/11/22/cache-api-fehlermeldung-cache-ist-nicht-verfugbar/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>Heute habe ich mich mit der CacheApi in ASP.Net beschäftigt.</p>
<p>Diese bietet in ASP.Net Seiten ähnlich dem Application oder Session Object die Möglichkeit Werte/Objekte zu speichern, ist hier aber intelligenter und verwirft die Objekte nach einer festgelegten Zeitdauer. Die Intellisense Hilfe zu den Methoden ist selbsterklärend: Ablauf nach einer Zeitspanne, nach einem absolutem Datum &#8230;</p>
<p>Selbsterklärend ? Dachte ich&#8230;  Bei der Verwendung erhielt ich beim ersten Zugriff auf Cache aus einer aspx-CodeBehind-Klasse heraus eine HTTPException mit der Meldung &#8222;Cache is not available&#8220; bzw &#8222;Cache ist nicht verfügbar&#8220;.  Lange habe ich nach der Lösung gesucht; vielleicht muss man den Cache ja irgendwo (web.config, Page Directive etc) aktivieren?! Aber nichts. Auch Google stellt sich dumm.</p>
<p>Letztenendes ist die Lösung einfach statt nur &#8222;Cache.Get(&#8230;&#8220;  &#8222;HttpContext.Current.Cache&#8230;&#8220; zu verwenden. Leider habe ich keine Erklärung parat woran es liegt ?!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Performanceoptimierung oder was .Net wirklich macht</title>
		<link>https://www.jepertinger-itconsulting.de/2011/05/16/performanceoptimierung-oder-was-net-wirklich-macht/</link>
		
		<dc:creator><![CDATA[Karl Jepertinger]]></dc:creator>
		<pubDate>Mon, 16 May 2011 18:46:12 +0000</pubDate>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Programmierung]]></category>
		<guid isPermaLink="false">http://blog.jepertinger-itconsulting.de/?p=162</guid>

					<description><![CDATA[Es kursiert immer wieder das Gerücht, dass bestimmte Anweisungen im Code &#8222;schneller&#8220; und besser sind als andere. Gerade Entwickler die in älteren Sprachen angefangen haben, trauen den &#8222;neuen&#8220; Sprachen nicht über den Weg. Auf der Suche nach Erklärungen habe ich &#8230; <a href="https://www.jepertinger-itconsulting.de/2011/05/16/performanceoptimierung-oder-was-net-wirklich-macht/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>Es kursiert immer wieder das Gerücht, dass bestimmte Anweisungen im Code &#8222;schneller&#8220; und besser sind als andere. Gerade Entwickler die in älteren Sprachen angefangen haben, trauen den &#8222;neuen&#8220; Sprachen nicht über den Weg.</p>
<p>Auf der Suche nach Erklärungen habe ich mich nun selber auch mal mit der Performance von alltäglichen Code beschäftigt. Wie wäre es z.B. mit String Operationen ? Da gibt es doch immer das Gerücht, das die Verbindung von Strings über &#8222;+&#8220; viel zu langsam ist. Damit fange ich doch gleich mal an&#8230;.<span id="more-162"></span>Also schnell mal den Code hier hingepinselt (Code1) und auch gleich die Verbesserung dazu (Code2).</p>
<pre class="brush: csharp; highlight: [20]; title: ; notranslate">
//Code1
Stopwatch watch = Stopwatch.StartNew();
string res = &quot;abc&quot; + &quot;abc123&quot;;
watch.Stop();
</pre>
<pre class="brush: csharp; highlight: [20]; title: ; notranslate">
//Code2
Stopwatch watch = Stopwatch.StartNew();
string res = String.Concat(&quot;abc&quot; + &quot;abc123&quot;);
watch.Stop();
</pre>
<p>Die Klasse Stopwatch zeigt, wie der Name schon sagt, die vertrichene Zeit an. Mit etwas Code drum rum zum Aufwärmen und Mitteln der Ausführungszeiten komme ich zu dem Schluss, dass beide 0 Millisekunden brauchen. Ein unbefriedigendes Ergebnis. Also die Messung umgestellt auf Ticks. Das Ergebnis ist, dass mit jeder Wiederholung die Ergebnisse etwas variieren, zwischen 1 und 4 Ticks. Das ist kein Unterschied&#8230;  Was ist da also los ? Was macht .Net hier wirklich ?</p>
<p>Um das weiter zu analysieren gibt es Profiler. Es gibt diverse Kaufprodukte (z.B. <a href="http://www.red-gate.com/"> Redgate Performance und Memory Profiler</a> ), aber auch Microsoft bietet gut versteckt einen Memory Profiler an.  Unter <a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=be2d842b-fdce-4600-8d32-a3cf74fda5e1">dem Link</a> gibt es den CLRProfiler für  .Net 4 direkt von Microsoft. Man startet über den Profiler sein eigenes Programm und kann auswerten was das eigene Programm so treibt.</p>
<p>32bit Profiler starten, &#8222;Start Application&#8220;, Pfad auswählen und Programm ausführen lassen. Nachdem es ausgeführt wurde, Klick auf View, Call Graph.</p>
<p>Das Erste was man sieht sind Unmengen von Aufrufen, die mit dem eigenen Programm nichts zu tun haben  &#8211; damit verbrät also .Net schon für ein einfaches Consolenprogramm mehrere MB&#8230;</p>
<p style="text-align: left;">Wenn man die Ansicht etwas einschränkt kommt folgendes Ergebnis für meine beiden Möglichkeiten heraus:</p>
<p style="text-align: left;"><a href="http://blog.jepertinger-itconsulting.de/wp-content/uploads/2011/05/stringperf.jpg" rel="lightbox-0"><img loading="lazy" class="aligncenter wp-image-173 size-medium" title="Call Graph String Concat" src="http://www.jepertinger-itconsulting.de/wp-content/uploads/2011/05/stringperf-300x196.jpg" alt="" width="300" height="196" srcset="https://www.jepertinger-itconsulting.de/wp-content/uploads/2011/05/stringperf-300x196.jpg 300w, https://www.jepertinger-itconsulting.de/wp-content/uploads/2011/05/stringperf.jpg 663w" sizes="(max-width: 300px) 100vw, 300px" /></a>Zu sehen ist eine zusammengestellte, gefilterte Ansicht der beiden relevanten Methoden. Der übersichtlichkeit halber Methode2 vor Methode 1.</p>
<p style="text-align: left;">Was ist da zu sehen ? Die Methode StringConcat2 führt  &#8211;  wie auch im Code zu sehen  &#8211; String.Concat aus. Aber was ist da bei StringConcat1 passiert ? Da findet sich auch ein String.Concat Aufruf darin! Den Aufruf der Klasse Datetime habe ich selber noch eingefügt, um überhaupt einen Aufruf bei der zweiten Methode zu sehen. Anscheinend hat .Net meine sinnlose Verbindung von nichtssagenden Strings ebenfalls für sinnlos befunden und gleich mal wegoptimiert. Erst durch das Hinzufügen eines &#8222;+ Datetime.Now.ToString()&#8220; habe ich quasi volle Überzeugungsarbeit geleistet, sodass der Profiler auch etwas anzuzeigen hatte &#8230;</p>
<p style="text-align: left;">Folgerungen:</p>
<ul>
<li>Das .Net-Runtime-Environment überarbeite den Code in nicht unerheblichem Maße</li>
<li>Die Diskussion um die bessere Variante derart einfacher, einzeiliger Stringverkettungen ist denkbar unsinnig.</li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
