<?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>C and it&#039;s sharp &#187; C#</title>
	<atom:link href="http://berndhengelein.de/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://berndhengelein.de</link>
	<description>berndhengelein.de</description>
	<lastBuildDate>Sat, 30 Oct 2010 20:08:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Compiler warning CS0067 – es muss nicht immer #pragma sein</title>
		<link>http://berndhengelein.de/2010/07/compiler-warning-cs0067-es-muss-nicht-immer-pragma-sein/</link>
		<comments>http://berndhengelein.de/2010/07/compiler-warning-cs0067-es-muss-nicht-immer-pragma-sein/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 23:15:10 +0000</pubDate>
		<dc:creator>Bernd</dc:creator>
				<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Clean Code]]></category>

		<guid isPermaLink="false">http://berndhengelein.de/?p=331</guid>
		<description><![CDATA[Da ist es wieder. Der Compiler spuckt die Warnung CS0067 “The event ‘XXX’ is never used” aus. Das kann z.B. passieren, wenn das Interface ICommand implementiert wird, das Command aber immer ausführbar sein soll. Das Event CanExecuteChanged muss also nie gefeuert werden:
&#160;
&#160;

public class SomeCommand : ICommand
{
	public void Execute(object parameter)
    {
		// do sth.
	}

	public [...]]]></description>
			<content:encoded><![CDATA[<p><img title="warningSign" style="border-right: 0px; border-top: 0px; display: inline; margin: 0px 15px 0px 0px; border-left: 0px; border-bottom: 0px" height="120" alt="warningSign" src="http://berndhengelein.de/wp-content/uploads/2010/07/warningSign1.png" width="120" align="left" border="0" />Da ist es wieder. Der Compiler spuckt die Warnung CS0067 “The event ‘XXX’ is never used” aus. Das kann z.B. passieren, wenn das Interface <a href="http://msdn.microsoft.com/en-us/library/system.windows.input.icommand.aspx" target="_blank">ICommand</a> implementiert wird, das Command aber immer ausführbar sein soll. Das Event <a href="http://msdn.microsoft.com/en-us/library/system.windows.input.icommand.canexecutechanged.aspx" target="_blank">CanExecuteChanged</a> muss also nie gefeuert werden:</p>
<p>&#160;</p>
<p>&#160;</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:8b02cd47-cb25-475c-a736-c1566396800d" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter:nocontrols">public class SomeCommand : ICommand
{
	public void Execute(object parameter)
    {
		// do sth.
	}

	public bool CanExecute(object parameter)
    {
		return true;
	}

	public event EventHandler CanExecuteChanged;
}</pre>
</div>
<p>Bei obiger Imlementierung bekommt man beim Übersetzten die Compiler Warnung CS0067:</p>
<blockquote>
<p>warning CS0067: The event &#8216;CommandDemo.SomeCommand.CanExecuteChanged&#8217; is never used</p>
</blockquote>
<p>Was einem als erstes (zumindest mir) einfällt die Warning zu “beheben”, ist sie mit einem <a href="http://msdn.microsoft.com/en-us/library/x74w198a.aspx" target="_blank">#pragma Statement</a> kurzzeitig aus- und wieder einzuschalten:</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:f04c9229-dfdb-4384-9a1a-b71df3ac080f" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter:nocontrols">#pragma warning disable 0067
	public event EventHandler CanExecuteChanged;
#pragma warning restore 0067</pre>
</div>
<p>So richtig gut gefällt diese Lösung aber nicht. Bei Implementierungen, wo das Event später vielleicht doch einmal gefeuert wird, ist die Wahrscheinlichkeit ziemlich hoch, dass diese #pragma Statements vergessen werden und im Code verbleiben. Das ist nicht schön. Aber es gibt eine andere, (mittlerweile meiner Ansicht nach bessere) Lösung:</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:5970b024-3c25-4b4c-86ed-03a01738c95c" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter:nocontrols">public event EventHandler CanExecuteChanged { add{} remove{} }</pre>
</div>
<p>Durch das Hinzufügen der leeren Eventaccessors “add” und “remove” mache ich klar, dass dieser Event nicht verwendet wird. Da das Event sowieso nie gefeuert wird, ändert sich auch für den potentiellen Konsumenten des Events nichts. Wenn in einer späteren Phase dieser Event doch einmal ausgelöst werden soll, wird der Entwickler sofort mit einem Kompilerfehler darauf hingewiesen, das dies nicht möglich ist. Die leeren “add” und “remove” Accessoren müssen also entweder wieder entfernt oder entsprechend vollständig implementiert werden ==&gt; der Code bleibt sauber.</p>
<p>Wie man sieht, muss man also nicht sofort zum #pragma greifen, wenn man mit der Warnung CS0067 konfrontiert wird. Das Hinzufügen der leeren Eventaccessoren bietet eine elegante und saubere Lösung mit dem Fall umzugehen.</p>
]]></content:encoded>
			<wfw:commentRss>http://berndhengelein.de/2010/07/compiler-warning-cs0067-es-muss-nicht-immer-pragma-sein/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Wie kriege ich mit, ob der Rechner gelockt wird?</title>
		<link>http://berndhengelein.de/2009/06/wie-kriege-ich-mit-ob-der-rechner-gelockt-wird/</link>
		<comments>http://berndhengelein.de/2009/06/wie-kriege-ich-mit-ob-der-rechner-gelockt-wird/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 20:31:33 +0000</pubDate>
		<dc:creator>Bernd</dc:creator>
				<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://berndhengelein.de/?p=257</guid>
		<description><![CDATA[Ja, ja, wenn man es mal weiß, dann ist alles einfach und sonnenklar.&#160; Ich wollte vor kurzem wissen, wie ich in einem Programm darauf reagieren kann, wenn der Computer gesperrt/gelockt wird. Das rauszufinden, hat überraschenderweise recht lange gedauert. Dabei hätte ich nur nach “SystemEvents” googeln müssen. Aber das wusste ich zu dem Zeitpunkt natürlich nicht.
Die [...]]]></description>
			<content:encoded><![CDATA[<p>Ja, ja, wenn man es mal weiß, dann ist alles einfach und sonnenklar.&#160; Ich wollte vor kurzem wissen, wie ich in einem Programm darauf reagieren kann, wenn der Computer gesperrt/gelockt wird. Das rauszufinden, hat überraschenderweise recht lange gedauert. Dabei hätte ich nur nach “<a href="http://msdn.microsoft.com/de-de/library/microsoft.win32.systemevents_events.aspx" target="_blank">SystemEvents</a>” googeln müssen. Aber das wusste ich zu dem Zeitpunkt natürlich nicht.</p>
<p>Die SystemEvents Klasse aus dem Microsoft.Win32 Namespace bietet einen Sack voll Events an, um auf Systemereignisse reagieren zu können. Unter anderem gibt es ein <a href="http://msdn.microsoft.com/de-de/library/microsoft.win32.systemevents.sessionswitch.aspx" target="_blank">SessionSwitch</a> Event:</p>
<p><a href="http://berndhengelein.de/wp-content/uploads/2009/06/image.png"><img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="183" alt="image" src="http://berndhengelein.de/wp-content/uploads/2009/06/image_thumb.png" width="598" border="0" /></a></p>
<p>Mit einem kleinen Testprogramm sieht man auch sofort, dass dieses Event gefeuert wird, wenn der Computer gesperrt wird:</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:7828c724-75cb-4936-ba7c-cdb610040ebc" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter:nocontrols">static void Main(string[] args)
{
    SystemEvents.SessionSwitch +=
    	(s, e) =&gt; Console.WriteLine("Event {0} received...",
                                	e.Reason);
    Console.ReadLine();
}</pre>
</div>
<p>Ein Sperren und Entsperren ergibt folgende Ausgabe:</p>
<blockquote>
<p>Event SessionLock received&#8230;<br />
    <br />Event SessionUnlock received&#8230;</p>
</blockquote>
<p>War doch gar nicht so schwer. Im realen Leben solltet ihr aber auf keinen Fall vergessen euch wieder von dem Event abzumelden. Ansonsten kann das Objekt, welches sich an dem Event angemeldet hat, nicht vom Garbage Collector abgeräumt werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://berndhengelein.de/2009/06/wie-kriege-ich-mit-ob-der-rechner-gelockt-wird/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fünf Freunde: Action, Predicate, Comparison, Converter und Lambda Ausdrücke</title>
		<link>http://berndhengelein.de/2009/05/funf-freunde-action-predicate-comparison-converter-und-lambda-ausdrucke/</link>
		<comments>http://berndhengelein.de/2009/05/funf-freunde-action-predicate-comparison-converter-und-lambda-ausdrucke/#comments</comments>
		<pubDate>Thu, 21 May 2009 21:53:09 +0000</pubDate>
		<dc:creator>Bernd</dc:creator>
				<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://berndhengelein.de/?p=249</guid>
		<description><![CDATA[Ich habe den Eindruck, dass die generischen Delegates aus dem .Net Framework vielerorts immer noch ein Schattendasein fristen. Mit ein paar einfachen Beispielen die zeigen, wofür man Action, Predicate und Co. verwenden kann, möchte ich Lust auf mehr machen. 
Generische Delegates ersparen dem Entwickler die Arbeit eigene Delegates zu deklarieren und kommen häufig in Verbindung [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe den Eindruck, dass die generischen Delegates aus dem .Net Framework vielerorts immer noch ein Schattendasein fristen. Mit ein paar einfachen Beispielen die zeigen, wofür man Action, Predicate und Co. verwenden kann, möchte ich Lust auf mehr machen. </p>
<p>Generische Delegates ersparen dem Entwickler die Arbeit eigene Delegates zu deklarieren und kommen häufig in Verbindung mit Containerklassen zur Anwendung.</p>
<p>Als Spielzeugklasse habe ich mir diesmal etwas ganz aussergewöhnliches einfallen lassen. Und zwar eine Klasse Person:</p>
</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:c38616e5-7ac5-4f8f-8a9d-5393c55847f9" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter:nocontrols">public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public bool IsCool { get; set; }

    public override string ToString()
    {
        return String.Format( "{0} is {1}.", Name, IsCool ? "cool" : "not cool" );
    }
}</pre>
</div>
<p>Dazu erzeugen wir uns noch ein paar &quot;Versuchspersonen&quot;:</p>
</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:56e6d8ea-b3a8-4582-bb15-04b5a0774cf1" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter:nocontrols">List&lt;Person&gt; persons = new List&lt;Person&gt;();

persons.Add( new Person {Name = "Karin", Age = 39} );
persons.Add( new Person {Name = "Simon", Age = 23} );
persons.Add( new Person {Name = "Fritz", Age = 34} );
persons.Add( new Person {Name = "Georg", Age = 56} );
persons.Add( new Person {Name = "Susi", Age = 67} );
persons.Add( new Person {Name = "Toni", Age = 45} );</pre>
</div>
<p><strong>Action&lt;T&gt; Delegate</strong></p>
<p>Der Action&lt;T&gt; Delegate kapselt eine Methode die einen Parameter übergeben bekommt und keinen Wert zurückgibt. Mit .Net 3.5 wurden noch zusätzliche Action Delegates eingeführt, die bis zu vier Parameter bekommen (Action&lt;T1, T2&gt;, Action&lt;T1, T2, T3&gt; und Action&lt;T1, T2, T3, T4&gt;).</p>
<p>Ein Action Delegate wird z.B. als Parameter für die ForEach Methode der Klasse List&lt;T&gt; benötigt. ForEach iteriert über die gesamte Liste und führt für jedes Element die übergebene Methode aus.</p>
<p><a href="http://berndhengelein.de/wp-content/uploads/2009/05/image.png"><img title="Action&lt;T&gt; delegate" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="84" alt="Action&lt;T&gt; delegate" src="http://berndhengelein.de/wp-content/uploads/2009/05/image-thumb.png" width="554" border="0" /></a> </p>
<p>Hier ein paar Beispiele: </p>
<p>Informationen über alle unsere Personen auf der Console ausgeben:</p>
</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:9571ca42-31d6-4343-aec8-8b396bb42f96" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter:nocontrols">persons.ForEach(Console.WriteLine);</pre>
</div>
<p>In Verbindung mit einem Lambdaausdruck werden alle Personen ganz schnell cool:</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:dd11ad82-c628-490b-a41c-b12f3b7dd361" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter:nocontrols">persons.ForEach(p =&gt; p.IsCool = true);</pre>
</div>
<p><strong>Predicate&lt;T&gt; Delegate</strong></p>
<p>Der Predicate&lt;T&gt; Delegate kapselt eine Methode die einen Parameter (vom Typ T) übergeben bekommt und <em>true</em> oder <em>false</em> zurückgibt. Es steckt aber auch Semantik in dem Predicate Delegate: er definiert einen Satz von Kriterien und überprüft ob das übergebene Objekt diese Kriterien erfüllt. Das klingt erstmal ziemlich geschwollen, aber ein Beispiel macht das schnell klar.</p>
<p><a href="http://berndhengelein.de/wp-content/uploads/2009/05/image1.png"><img title="Predicate&lt;T&gt; delegate" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="100" alt="Predicate&lt;T&gt; delegate" src="http://berndhengelein.de/wp-content/uploads/2009/05/image-thumb1.png" width="657" border="0" /></a> </p>
</p>
<p>Um z.B. alle Personen die älter als 50 sind zu entfernen, schreiben wir:</p>
</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:23ab3e0e-895e-4add-b3a4-e021c6580c95" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter:nocontrols">persons.RemoveAll( p =&gt; p.Age &gt; 50 );</pre>
</div>
<p>Mit der Methode Exists kann überprüft werden, ob in der Liste Element enhalten sind, die eine bestimmte Bedingung erfüllen:</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:66d033f0-c348-4a81-97d8-7d63c709b26a" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter:nocontrols">if (persons.Exists(p =&gt; p.Name == "Toni"))
{
    Console.WriteLine("A person with name Toni exists");
}</pre>
</div>
<p><strong>Comparison&lt;T&gt; Delegate</strong></p>
<p>Der Comparison&lt;T&gt; Delegate kapselt eine Methode die zwei Objekte gleichen Typs vergleicht.</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:22426398-c5f7-416f-9294-deeb253ca528" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter:nocontrols">public delegate int Comparison&lt;T&gt;
(
	T x,
	T y
)
</pre>
</div>
<p>Als Rückgabewert dient ein Integer der anzeigt, ob die beiden Objekte gleich sind:</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="199"><strong>Rückgabewert</strong></td>
<td valign="top" width="199"><strong>Bedingung</strong></td>
</tr>
<tr>
<td valign="top" width="199">Kleiner als 0</td>
<td valign="top" width="199">x ist kleiner als y</td>
</tr>
<tr>
<td valign="top" width="199">0</td>
<td valign="top" width="199">x und y sind gleich</td>
</tr>
<tr>
<td valign="top" width="199">Größer als 0</td>
<td valign="top" width="199">x ist größer als y</td>
</tr>
</tbody>
</table>
<p> Um die Liste von Personen nach dem Alter aufsteigend zu sortieren, übergebe ich der <em>Sort()</em> Methode einen Comparison Delegate:</p>
<p><a href="http://berndhengelein.de/wp-content/uploads/2009/05/image2.png"><img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="143" alt="image" src="http://berndhengelein.de/wp-content/uploads/2009/05/image-thumb2.png" width="563" border="0" /></a> </p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:2d14bf95-db91-4339-8aba-963291ce07b3" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter:nocontrols">persons.Sort( (person1, person2) =&gt; person1.Age.CompareTo( person2.Age ) );</pre>
</div>
<p><strong></strong></p>
<p><strong>Converter&lt;TInput, TOutput&gt; Delegate</strong></p>
<p>Der Converter&lt;TInput, TOutput&gt; Delegate repräsentiert eine Methode die ein Objekt vom Typ TInput als Parameter bekommt und ein Objekt vom Typ TOutput zurückgibt. Der Hauptanwendungsfall ist das Konvertieren von Elementen in einem Array oder einer Liste.</p>
<p>Die Liste von Personen kann z.B. einfach in eine Liste von Namen konvertiert werden:</p>
</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:50972c95-fc64-48a5-a6ee-757f07275b82" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter:nocontrols">List&lt;string&gt; names = persons.ConvertAll( p =&gt; p.Name );</pre>
</div>
<p>Durch das Naming der Methode <em>ConvertAll</em> geht auch sehr schön hervor, dass es sich um eine Konvertierung handelt. Dadurch entsteht lesbarer, verständlicher Code.</p>
<p>&#160;</p>
<p>Die generischen Delegates des.Net Frameworks, bieten eine elegante Möglichkeit mit den Containerklassen zu arbeiten. Durch die Verwendung von Lambda Ausdrücken führt das Finden, Sortieren usw. von Listen zur sehr schönem, lesbaren Code. Ich finde die generischen Delegates klasse!</p>
]]></content:encoded>
			<wfw:commentRss>http://berndhengelein.de/2009/05/funf-freunde-action-predicate-comparison-converter-und-lambda-ausdrucke/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

