<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C#</title><link>http://blogger.xs4all.nl/detrio00/category/12960.aspx</link><description>Alles wat met C# te maken heeft....</description><managingEditor>Dennis Vroegop</managingEditor><dc:language>en-US</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>Dennis Vroegop</dc:creator><title>Ik ga verhuizen!</title><link>http://blogger.xs4all.nl/detrio00/archive/2006/03/07/81178.aspx</link><pubDate>Tue, 07 Mar 2006 00:07:00 GMT</pubDate><guid>http://blogger.xs4all.nl/detrio00/archive/2006/03/07/81178.aspx</guid><wfw:comment>http://blogger.xs4all.nl/detrio00/comments/81178.aspx</wfw:comment><comments>http://blogger.xs4all.nl/detrio00/archive/2006/03/07/81178.aspx#Feedback</comments><slash:comments>34</slash:comments><wfw:commentRss>http://blogger.xs4all.nl/detrio00/comments/commentRss/81178.aspx</wfw:commentRss><trackback:ping>http://blogger.xs4all.nl/detrio00/services/trackbacks/81178.aspx</trackback:ping><description>&lt;P&gt;Nou ja.. ik niet, maar mijn blog wel. En wel naar &lt;A href="http://www.dotned.nl/blogs/dennis_blog/default.aspx"&gt;http://www.dotned.nl/blogs/dennis_blog/default.aspx&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Dus vanaf nu kun je me daar vinden, mocht je geinteresseerd zijn in .net, 'from the trenches' en alle andere dingen die ik beschreef.&lt;/P&gt;
&lt;P&gt;Hope to see you on the other side!&lt;/P&gt;
&lt;P&gt;Dennis&lt;/P&gt;
&lt;P&gt; &lt;/P&gt;&lt;img src ="http://blogger.xs4all.nl/detrio00/aggbug/81178.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Dennis Vroegop</dc:creator><title>Veel, heeeeel veel info over Linq</title><link>http://blogger.xs4all.nl/detrio00/archive/2006/02/16/78610.aspx</link><pubDate>Thu, 16 Feb 2006 12:20:00 GMT</pubDate><guid>http://blogger.xs4all.nl/detrio00/archive/2006/02/16/78610.aspx</guid><wfw:comment>http://blogger.xs4all.nl/detrio00/comments/78610.aspx</wfw:comment><comments>http://blogger.xs4all.nl/detrio00/archive/2006/02/16/78610.aspx#Feedback</comments><slash:comments>43</slash:comments><wfw:commentRss>http://blogger.xs4all.nl/detrio00/comments/commentRss/78610.aspx</wfw:commentRss><trackback:ping>http://blogger.xs4all.nl/detrio00/services/trackbacks/78610.aspx</trackback:ping><description>&lt;P&gt;Als je bezig bent met Linq, is het wellicht handig om hier eens naar te kijken: &lt;A href="http://objectsharp.com/blogs/barry/archive/2005/09/13/3395.aspx"&gt;http://objectsharp.com/blogs/barry/archive/2005/09/13/3395.aspx&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Hier vindt je een verzameling met links naar Linq...&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src ="http://blogger.xs4all.nl/detrio00/aggbug/78610.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Dennis Vroegop</dc:creator><title>Visual Studio Team Foundation Server RC</title><link>http://blogger.xs4all.nl/detrio00/archive/2006/02/08/77678.aspx</link><pubDate>Wed, 08 Feb 2006 14:59:00 GMT</pubDate><guid>http://blogger.xs4all.nl/detrio00/archive/2006/02/08/77678.aspx</guid><wfw:comment>http://blogger.xs4all.nl/detrio00/comments/77678.aspx</wfw:comment><comments>http://blogger.xs4all.nl/detrio00/archive/2006/02/08/77678.aspx#Feedback</comments><slash:comments>27</slash:comments><wfw:commentRss>http://blogger.xs4all.nl/detrio00/comments/commentRss/77678.aspx</wfw:commentRss><trackback:ping>http://blogger.xs4all.nl/detrio00/services/trackbacks/77678.aspx</trackback:ping><description>&lt;P&gt;De release candidate van TFServer is beschikbaar. Dat betekent normaal gesproken dat we erg dicht bij de uiteindelijke versie zitten, deze is gepland voor ergens in maart.&lt;/P&gt;
&lt;P&gt;Ik had Beta3 Refresh al geinstalleerd en de upgrade ging relatief eenvoudig. Er zijn wel wat verschillen tussen B3 en RC, dus zorg ervoor dat je eerst de documentatie die er bij zit goed leest! Ik had wat issues met betrekking tot de domain controller en ook klaagde de installer over de reeds aanwezige databases. Op zich was dit niet zo'n probleem: ik had nog geen echte code in de databases zitten. Ik kon gewoon de oude data weggooien en de installer een nieuwe database laten genereren. Voor de mensen die dat niet kunnen: er zit in de download een aantal tools die je helpen met de migratie. &lt;/P&gt;
&lt;P&gt;Er is een Go-Live licentie voor zowel Beta 3 als voor de RC beschikbaar, dus niets staat je in de weg om Foundation Server eens te proberen! Ik moet zeggen dat ik erg gecharmeerd ben van het hele product.&lt;/P&gt;
&lt;P&gt;Ok, er is niets nieuws onder de zon. Alles wat Foundation Server je biedt was al beschikbaar in de een of andere vorm. Laten we eens kijken:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Team Pages. Tja, in Sharepoint Services kon je dat al, het voordeel nu is dat je een template hebt.&lt;/LI&gt;
&lt;LI&gt;Integrated Unit Testing. nUnit, wie kent het niet?&lt;/LI&gt;
&lt;LI&gt;MSBuild: nAnt is een hele goede, open source tool die hetzelfde doet&lt;/LI&gt;
&lt;LI&gt;Work Item tracking: ook dit kon je al doen met Sharepoint Services&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;En zo zijn er nog veel dingen die je al lang kunt doen met gratis en/of open source software. &lt;/P&gt;
&lt;P&gt;Waarom ben ik dan toch zo enthousiast over Foundation Server? Wel, de reden daarvoor is dat je nu alles in een systeem hebt. Dat systeem is nog eens gestandaardiseerd ook: bedrijven zullen veel sneller een dergelijke toolset van Microsoft gaan gebruiken dan dat ze de beheerder opdracht geven een tiental open source tools te downloaden en installeren. Ik zeg niet dat ik het met een dergelijk beleid eens ben, maar het is wel wat ik om me heen zie. Het is het idee &amp;#8220;Als het van Microsoft is, dan is het wel goed.&amp;#8221; Het leuke is dat ze in dit geval nog eens gelijk hebben ook.&lt;/P&gt;
&lt;P&gt;Ik heb mijn eerste projecten nu in Foundation Server staan en de werking van de tools (met als belangrijkste Team Explorer) is erg intuitief. &lt;/P&gt;
&lt;P&gt;Voor veel tips en tutorials verwijs ik je even door naar &lt;A href="http://teamsystemrocks.com"&gt;http://teamsystemrocks.com&lt;/A&gt; Deze site staat vol met links naar blogs, tuturiol video's en andere interessante zaken.&lt;/P&gt;
&lt;P&gt;Happy coding!&lt;/P&gt;&lt;img src ="http://blogger.xs4all.nl/detrio00/aggbug/77678.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Dennis Vroegop</dc:creator><title>Dave Sussman op de dotNED bijeenkomst</title><link>http://blogger.xs4all.nl/detrio00/archive/2006/01/30/76403.aspx</link><pubDate>Mon, 30 Jan 2006 16:40:00 GMT</pubDate><guid>http://blogger.xs4all.nl/detrio00/archive/2006/01/30/76403.aspx</guid><wfw:comment>http://blogger.xs4all.nl/detrio00/comments/76403.aspx</wfw:comment><comments>http://blogger.xs4all.nl/detrio00/archive/2006/01/30/76403.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blogger.xs4all.nl/detrio00/comments/commentRss/76403.aspx</wfw:commentRss><trackback:ping>http://blogger.xs4all.nl/detrio00/services/trackbacks/76403.aspx</trackback:ping><description>&lt;P&gt;Eens in de zoveel tijd mogen we bij dotNED, de Nederlandse .NET gebruikersgroep een spreker van wereldfaam uitnodigen. Donderdag 26 januari was het weer zover, we hadden Dave Sussman dit keer te gast, die een verhaal vertelde over caching in ASP.Net 2.0 en SQLServer 2000 en 2005.&lt;/P&gt;
&lt;P&gt;We hadden 75 inschrijvingen, daarvan kwamen er ongeveer 65 opdagen. Die tien die er niet waren hebben een hele interessante avond gemist! Na de reguliere sessie (voor zover je van regulier kunt spreken) werd het tijd voor Q&amp;amp;A. Iedereen kon vragen wat hij wilde, als het maar met ASP.Net 2.0 te maken had. Er kwamen een aantal hele goede vragen en ook antwoorden!&lt;/P&gt;
&lt;P&gt;Voor iedereen die er niet bij was: hou &lt;A href="http://www.dotned.nl"&gt;http://www.dotned.nl&lt;/A&gt; in de gaten voor meer van dit soort avonden!&lt;/P&gt;
&lt;P&gt;&lt;IMG id=ViewPicture.ascx_GalleryImage style="BORDER-RIGHT: black 2px solid; BORDER-TOP: black 2px solid; BORDER-LEFT: black 2px solid; WIDTH: 500px; BORDER-BOTTOM: black 2px solid; HEIGHT: 340px" alt="Dave Sussman in voorbereiding" src="/images/blogger_xs4all_nl/detrio00/16379/r_sussman.jpg"&gt;&lt;/P&gt;
&lt;P&gt;Foto: Dave Sussman aan het voorbereiden.&lt;/P&gt;&lt;img src ="http://blogger.xs4all.nl/detrio00/aggbug/76403.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Dennis Vroegop</dc:creator><title>Microsoft Virtual Labs</title><link>http://blogger.xs4all.nl/detrio00/archive/2006/01/17/74653.aspx</link><pubDate>Tue, 17 Jan 2006 14:38:00 GMT</pubDate><guid>http://blogger.xs4all.nl/detrio00/archive/2006/01/17/74653.aspx</guid><wfw:comment>http://blogger.xs4all.nl/detrio00/comments/74653.aspx</wfw:comment><comments>http://blogger.xs4all.nl/detrio00/archive/2006/01/17/74653.aspx#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://blogger.xs4all.nl/detrio00/comments/commentRss/74653.aspx</wfw:commentRss><trackback:ping>http://blogger.xs4all.nl/detrio00/services/trackbacks/74653.aspx</trackback:ping><description>&lt;P&gt;Even een kort berichtje. &lt;/P&gt;
&lt;P&gt;Je kent het wel: je wilt eens spelen met de laatste tools van Microsoft, maar die moet je weer helemaal downloaden, installeren, configureren en daarna weer van je machine afhalen (zo'n harde schijf is immers zo vol, niet waar?)&lt;/P&gt;
&lt;P&gt;Wellicht is dit dan een oplossing: Microsoft heeft tegenwoordig de Virtual Labs online staan. Dat is in principe niets anders dan een batterij servers die allemaal Virtual Server draaien met daarop geconfigureerd een aantal tools en platforms. Jij kunt daar dan op inloggen en dan heb je die machine zo'n 90 minuten tot je beschikking. Er zijn meestal een aantal oefeningen bij zodat je eens kunt spelen met Biztalk, Windows Workflow Foundation, ASP.NET 2.0 en nog veel meer. Als je je nou verveelt, is dit wellicht eens leuk om te doen. Het kost niets!&lt;/P&gt;
&lt;P&gt;Hier is de link: &lt;A href="http://msdn.microsoft.com/virtuallabs/default.aspx"&gt;http://msdn.microsoft.com/virtuallabs/default.aspx&lt;/A&gt;&lt;/P&gt;&lt;img src ="http://blogger.xs4all.nl/detrio00/aggbug/74653.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Dennis Vroegop</dc:creator><title>Een eerste blik op LINQ</title><link>http://blogger.xs4all.nl/detrio00/archive/2005/11/10/66350.aspx</link><pubDate>Thu, 10 Nov 2005 22:10:00 GMT</pubDate><guid>http://blogger.xs4all.nl/detrio00/archive/2005/11/10/66350.aspx</guid><wfw:comment>http://blogger.xs4all.nl/detrio00/comments/66350.aspx</wfw:comment><comments>http://blogger.xs4all.nl/detrio00/archive/2005/11/10/66350.aspx#Feedback</comments><slash:comments>56</slash:comments><wfw:commentRss>http://blogger.xs4all.nl/detrio00/comments/commentRss/66350.aspx</wfw:commentRss><trackback:ping>http://blogger.xs4all.nl/detrio00/services/trackbacks/66350.aspx</trackback:ping><description>&lt;P&gt;Het is alweer enige tijd geleden dat ik iets over C# 3.0 geschreven heb, maar dat ga ik nu (min of meer) goedmaken. Ik vervolg deze serie nu met een aantal artikelen over een van de toepassingen van de nieuwe mogelijkheden: Linq. &lt;/P&gt;
&lt;P&gt;Linq staat voor Language Integrated Query. Zoals de naam al aangeeft geeft ons dat de mogelijkheid om in de taal (in dit geval C# maar VB.Net kan er ook mee overweg) queries te definieren. &lt;SPAN lang=en-us&gt;Het verhaal achter het ontstaan van Linq zal ik hier even kort schetsen, zodat je een beeld hebt wat de geschiedenis is.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN lang=en-us&gt;Neem eens een stuk code dat je recentelijk geschreven hebt. Kijk er eens goed naar en ga dan kijken hoe vaak je in die code "zoekt" naar zaken. Denk bijvoorbeeld aan het doorlopen van een ArrayList instance met daarin Customer objecten. Regelmatig schrijf je code die in die lijst op zoek gaat naar alle klanten die nog een betaling open hebben staan. Of je wilt een overzicht van alle klanten in je lijst die aangegeven hebben dat ze informatie per email willen ontvangen. Of je wilt simpelweg in die lijst op zoek gaan naar die ene klant met klantnummer 'xyz123' zodat je de gegevens daarvan op het scherm kunt tonen. Als je goed kijkt, zul je zien dat het zoeken naar gegevens in lijsten (in wat voor vorm dan ook) best vaak voorkomt.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN lang=en-us&gt;Echter, een goede methode om te zoeken is er niet. Neem de volgende code eens:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'"&gt;// Initializeer de boel&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'"&gt;Customer&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt; displayCustomer = &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;bool&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt; bFound = &lt;SPAN style="COLOR: blue"&gt;false&lt;/SPAN&gt;;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;int&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt; counter = 0;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'"&gt;// Zoek de juiste klant&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;while&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;( (!bFound) &amp;amp;&amp;amp; (counter &amp;lt; customerList.Count) ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; displayCustomer = (&lt;SPAN style="COLOR: teal"&gt;Customer&lt;/SPAN&gt;)customerList[counter];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt;( displayCustomer.CustomerID == &lt;SPAN style="COLOR: maroon"&gt;"xyz123"&lt;/SPAN&gt; ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bFound = &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; counter++;&lt;BR&gt;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;if&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;( bFound ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// Laat zien&lt;BR&gt;&lt;/SPAN&gt;} &lt;SPAN style="COLOR: blue"&gt;else&lt;/SPAN&gt; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// Geef foutmelding&lt;BR&gt;&lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'"&gt;// Enzovoorts...&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;&lt;FONT size=2&gt;&lt;SPAN style="FONT-FAMILY: Arial"&gt;Ik weet het, deze code kan beter. Je kunt natuurlijk een specifieke CustomerList type definieren, met daarin de juiste zoekcode. Maar die zal er niet echt anders uitzien dan bovenstaande code. &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;&lt;FONT size=2&gt;&lt;SPAN style="FONT-FAMILY: Arial"&gt;Zoeken is behoorlijk belangrijk de meeste, serieuze applicaties. Er zijn vele voorbeelden te verzinnen: zoeken naar de inlognaam van de gebruiker om zijn of haar wachtwoord te controleren, zoeken naar de bestanden in de plugin-directory, zoeken naar de geinstalleerde printers op het systeem, zoeken naar.. affijn, je snapt het wel.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;&lt;FONT size=2&gt;&lt;SPAN style="FONT-FAMILY: Arial"&gt;Zoeken gebeurdt uiteraard ook in databases. Da's mooi, zul je denken, want daar hoef ik niet zo veel voor te doen. Alles wat ik moet doen is de juiste SQL code schrijven en de database regelt het zelf wel. Maar heb je je wel eens gerealiseerd dat dat eigenlijk een hele vreemde constructie oplevert? Je schrijft hele mooie, goed gedocumenteerde, door de compiler op alle details gecontroleerde C# of VB.Net code, vervolgens plak je daar een string (!!!) in met daarin een stuk code in een hele andere taal, namelijk SQL. Denk daar eens over na: in onze code staat opeens een niet te controleren, niet te compileren en dus niet te verifieren string met een andere programmeertaal daarin. Vreemd, vind je niet?&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;&lt;FONT size=2&gt;&lt;SPAN style="FONT-FAMILY: Arial"&gt;Als je nu veel met XML werkt (en wie doet dat tegenwoordig niet?) dan krijg je te maken met weer een hele andere manier van zoeken in data. Nu kun je met XQuery of XPath aan de gang gaan, of je itereert zelf over de elementen in je XML document heen en goet alles zelf. &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;&lt;FONT size=2&gt;&lt;SPAN style="FONT-FAMILY: Arial"&gt;Zoeken, zoeken en zoeken. We doen het nogal eens in onze applicatie, op heel veel verschillende en elkaar min of meer tegensprekende methodes. Om daar nu wat aan te doen, is het Project Linq geboren. Het idee hierachter is: laten we alle mogelijke manieren van zoeken (querien in slecht nederlands) nu eens onder de loep nemen en daar een uniforme, strongly typed, verifieerbare en compileerbare methode voor verzinnen. En dat hebben ze gedaan.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;&lt;FONT size=2&gt;&lt;SPAN style="FONT-FAMILY: Arial"&gt;Al gauw bleek dat dat niet zo eenvoudig was en om dat op een goede manier te doen moest de taal C# en VB.Net aangepast worden. Welke aanpassingen dat zijn, heb je in mijn vorige postings kunnen lezen (ja ja, er zat een lijn in het verhaal!). Met die uitbreidingen is Linq mogelijk geworden. Ik zal nog even op een rijtje zetten welke nieuwe mogelijkheden er komen:&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;&lt;FONT size=2&gt;&lt;SPAN style="FONT-FAMILY: Arial"&gt;Type inferrence (var q = ....)&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;&lt;FONT size=2&gt;&lt;SPAN style="FONT-FAMILY: Arial"&gt;Extension methods&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;&lt;FONT size=2&gt;&lt;SPAN style="FONT-FAMILY: Arial"&gt;Initializers&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;&lt;FONT size=2&gt;&lt;SPAN style="FONT-FAMILY: Arial"&gt;Anonymous types&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;&lt;FONT size=2&gt;&lt;SPAN style="FONT-FAMILY: Arial"&gt;Lambda expressions&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;Met dit alles kunnen we bovenstaande code anders gaan schrijven, op een manier die ons behoorlijk bekend voor zal komen:&lt;BR&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;var&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt; displayCustomer = &lt;SPAN style="COLOR: blue"&gt;from&lt;/SPAN&gt; customer &lt;SPAN style="COLOR: blue"&gt;in&lt;/SPAN&gt; customerList &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;where&lt;/SPAN&gt; customer.CustomerID == &lt;SPAN style="COLOR: maroon"&gt;"xyz123"&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;select&lt;/SPAN&gt; customer;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;if&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt; (displayCustomer != &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// Laat zien&lt;BR&gt;&lt;/SPAN&gt;}&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;else&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// Geef foutmelding&lt;BR&gt;&lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;En dit doet dus precies hetzelfde...&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;Laat je niet verwarren door de rare plaatsing van 'select', dit leg ik nog wel uit. Maar afgezien daarvan is dit 'gewoon' SQL in C# syntax. De enige aanpassing die ik gedaan heb is dat customerList nu geen ArrayList meer is maar een List&amp;lt;Customer&amp;gt;. Dat maakt echter voor mijn verhaal niets uit.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;Laten we eens kijken hoe dit nou kan. &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;Je moet weten dat de namespace System.Query (waar Linq in is gedefnieerd) voornamelijk bestaat uit een aantal extension methods op het type IEnumerable&amp;lt;T&amp;gt;. Met andere woorden: alles wat de interface IEnumerable&amp;lt;T&amp;gt; implementeert heeft een aantal extra methods gekregen. Een van die methods is bijvoorbeeld Where(); Die zit er als volgt uit:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'"&gt;IEnumerable&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&amp;lt;T&amp;gt; IEnumerable.Where&amp;lt;T&amp;gt;((T) =&amp;gt; &lt;SPAN style="COLOR: blue"&gt;bool&lt;/SPAN&gt; : predicate)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;Met andere woorden: de method Where heeft als resultaat een IEnumerable&amp;lt;T&amp;gt; en als argument de lambda expression (T) =&amp;gt; bool: predicate, oftewel er wordt een anonymous method gemaakt die een bool terug geeft. Dus als we dat even toepassen op onze customerList gaat dat er als volgt uitzien:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;var&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt; resultList = customerList.Where( (Customer c) =&amp;gt; c.CustomerID == &lt;SPAN style="COLOR: maroon"&gt;"xyz123"&lt;/SPAN&gt; );&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;Vertaling: neem onze List&amp;lt;Customer&amp;gt; customerList (welke IEnumerable&amp;lt;Customer&amp;gt; implementeert). Voer daar de 'Where' method op uit. In die Where method geven we mee de lambda expressie (nogmaals, lees mijn vorige postings over dit onderwerp om te begrijpen wat dat precies is) (Customer c) =&amp;gt; c.CustomerID == "xyz123" . Er wordt nu dus een anonymous method gedefnieerd die voor iedere Customer instance in de lijst kijkt naar de CustomerID en die vergelijkt met "xyz123". Daar komt een bool uit (true of false) en als hij true is, dan wordt die Customer instance aan de nieuwe resultList toegevoegd. Overigens is resultList ook een class die IEnumerable&amp;lt;T&amp;gt; implementeert....&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;Kijk hier nog eens goed naar, laat het even bezinken. Ik wacht wel even.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;Goed. Het resultaat is dus een IEnumerable&amp;lt;T&amp;gt;. Daarop kunnen we dan weer andere extension methods toepassen, welke bijna allemaal een IEnumerable&amp;lt;T&amp;gt; terug geven. We kunnen dus een hele rij van dit soort methods aanroepen: Lijst.Where().Where().GroupBy().Select(); Anders weergegeven:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;Lijst.Where().&lt;BR&gt;&amp;nbsp;Where().&lt;BR&gt;&amp;nbsp;GroupBy().&lt;BR&gt;&amp;nbsp;Select();&lt;BR&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;Nou hebben we net gezien in mijn voorbeeld dat we helemaal geen IEnumerable&amp;lt;T&amp;gt;.Where() method gebruiken. Nee, we roepen gewoon from type x in lijst where x.iets == "bla" select x.ID; of zo iets dergelijks. De reden dat dat werkt is door het gebruik van Expression Trees. Dat is wellicht iets voor andere posting, maar neem nu maar even van me aan dat dat er voor zorgt dat onze mooie, SQL-achtige syntax verandert in die reeks van method calls en dat alle code achter bijvoorbeeld de where vertaalt wordt in een lambda expressie. Moeilijk is dat niet, het is een kwestie van haakjes en dergelijke toevoegen.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;Dat betekent dat onze eerste voorbeeld code er eigenlijk zo uit gaat zien:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;var&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt; displayCustomer = customerList&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Where((Customer customer) =&amp;gt; customer.CustomerID == &lt;SPAN style="COLOR: maroon"&gt;"xyz123"&lt;/SPAN&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Select(customer =&amp;gt; customer);&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;En deze code moet nu te begrijpen zijn. &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;Je ziet het: als je er even naar kijkt, is het op zich vrij logisch. Maar je moet er even aan wennen. Persoonlijk vind ik mijn eerste Linq voorbeeld qua code duidelijker en overzichtelijker dan mijn eerst code-voorbeeld in deze posting.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;Volgende keer ga ik kijken naar DLinq, oftewel Linq'en op een database. Het zal je niet verbazen dat dat vrijwel hetzelfde werkt als wat ik je nu heb laten zien.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;Tot dan!&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=en-us&gt;PS Mocht je opmerkingen, vragen of iets anders te melden hebben, aarzel dan niet om te reageren, hetzij via het commentaarvakje, hetzij via de mail. Op die manier weet ik of er uberhaupt mensen geinteresseerd zijn in wat ik te melden heb over dit onderwerp.&lt;/SPAN&gt;&lt;/P&gt;&lt;img src ="http://blogger.xs4all.nl/detrio00/aggbug/66350.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Dennis Vroegop</dc:creator><title>Sorry, sorry, sorry...</title><link>http://blogger.xs4all.nl/detrio00/archive/2005/10/25/64516.aspx</link><pubDate>Tue, 25 Oct 2005 21:33:00 GMT</pubDate><guid>http://blogger.xs4all.nl/detrio00/archive/2005/10/25/64516.aspx</guid><wfw:comment>http://blogger.xs4all.nl/detrio00/comments/64516.aspx</wfw:comment><comments>http://blogger.xs4all.nl/detrio00/archive/2005/10/25/64516.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogger.xs4all.nl/detrio00/comments/commentRss/64516.aspx</wfw:commentRss><trackback:ping>http://blogger.xs4all.nl/detrio00/services/trackbacks/64516.aspx</trackback:ping><description>&lt;P&gt;Ik had beloofd om een stukje van (D/X)Linq te laten zien. En dat heb ik dus nog niet gedaan. De reden daarvoor is dat ik het erg druk heb gehad, onder andere met het voorbereiden van mijn praatje voor de Nederlandse .NET gebruikersgroep, over hetzelfde onderwerp.&lt;/P&gt;
&lt;P&gt;Het goede nieuws is dat ik nu nog beter weet wat ik jullie over C# 3.0 en Linq wil vertellen en ook hoe ik dat moet doen! Dus de rest van de artikelen worden nog beter!&lt;/P&gt;
&lt;P&gt;Overigens: voor diegenen die niet kunnen wachten tot ik alles klaar heb en hier geplaatst heb, heb ik hier een&lt;A href="http://msdn.microsoft.com/netframework/future/linq"&gt; link naar de officiele site van Linq.&lt;/A&gt; Daarop staan diverse whitepapers en de preview-compiler, zodat je er zelf mee aan de gang kunt gaan.&lt;/P&gt;
&lt;P&gt;Tot die tijd! Veel plezier en happy coding!&lt;/P&gt;&lt;img src ="http://blogger.xs4all.nl/detrio00/aggbug/64516.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Dennis Vroegop</dc:creator><title>Oude wijn in nieuwe zakken? Lambda expressies! (De toekomst van C#, deel 5)</title><link>http://blogger.xs4all.nl/detrio00/archive/2005/10/09/62488.aspx</link><pubDate>Sun, 09 Oct 2005 20:21:00 GMT</pubDate><guid>http://blogger.xs4all.nl/detrio00/archive/2005/10/09/62488.aspx</guid><wfw:comment>http://blogger.xs4all.nl/detrio00/comments/62488.aspx</wfw:comment><comments>http://blogger.xs4all.nl/detrio00/archive/2005/10/09/62488.aspx#Feedback</comments><slash:comments>24</slash:comments><wfw:commentRss>http://blogger.xs4all.nl/detrio00/comments/commentRss/62488.aspx</wfw:commentRss><trackback:ping>http://blogger.xs4all.nl/detrio00/services/trackbacks/62488.aspx</trackback:ping><description>&lt;p&gt;&lt;font size="5"&gt;Lambda expressies&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Lambda expressies zijn niets nieuws. De eerste publicatie over 'lambda calculus' 
dateert uit de jaren dertig, dat is dus ver voordat men na begon te denken over 
C#. Lambda expressies vormen een belangrijk onderdeel van de taal Lisp maar zijn 
ook in andere omgevingen terug te vinden. Voor een overzicht van de Lambda calculus, 
zie
&lt;a title="Wikipedia uitleg over Lambda calculus." target="_blank" href="http://en.wikipedia.org/wiki/Lambda_calculus"&gt;
deze entry in Wikipedia.&lt;/a&gt; Voor ons is het genoeg om te weten dat een Lambda expressie 
een andere schrijfwijze voor een functie is. Ik zal een voorbeeld geven:&lt;/p&gt;
&lt;p&gt;Neem de wiskundige functie die een getal met zichzelf vermenigvuldigt: f(x) = 
x * x. In de lambda notatie wordt dat ? &lt;i&gt;x&lt;/i&gt;. &lt;i&gt;x&lt;/i&gt; * &lt;i&gt;x&lt;/i&gt;. In C# drukken 
we dat uit als &lt;span style="font-size: 10.0pt; font-family: Courier New"&gt;(&lt;span style="color:blue"&gt;int&lt;/span&gt; 
x) =&gt; x * x;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Let op: dit is geen compileerbare code, dit is slechts een schrijfwijze van een 
functie!&lt;/p&gt;
&lt;p&gt;Een ander voorbeeld is bijvoorbeeld een functie die twee doubles bij elkaar optelt 
en het resultaat teruggeeft:
&lt;span style="font-size: 10.0pt; font-family: Courier New"&gt;(&lt;span style="color:blue"&gt;double&lt;/span&gt; 
x, &lt;span style="color:blue"&gt;double&lt;/span&gt; y) =&gt; &lt;span style="color:blue"&gt;return&lt;/span&gt; 
x + y;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;We kunnen deze schrijfwijze gebruiken om de anonymous methods uit C# 2.0 te vereenvoudigen. 
Neem bijvoorbeeld de method List&lt;T&gt;.FindAll(). Deze method ziet er als volgt uit:&lt;/p&gt;
&lt;p class="MsoNormal" style="text-autospace: none"&gt;
&lt;span style="font-size: 10.0pt; font-family: Courier New; color: blue"&gt;public&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New"&gt;
&lt;span style="color:teal"&gt;List&lt;/span&gt;&lt;T&gt; &lt;span style="color:teal"&gt;List&lt;/span&gt;&lt;T&gt;.FindAll(&lt;span style="color:teal"&gt;Predicate&lt;/span&gt;&lt;T&gt; 
match) { ... }&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;De Predicate staat voor een delegate:&lt;/p&gt;
&lt;p class="MsoNormal" style="text-autospace: none"&gt;
&lt;span style="font-size: 10.0pt; font-family: Courier New; color: blue"&gt;public&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New"&gt;
&lt;span style="color:blue"&gt;delegate&lt;/span&gt; &lt;span style="color:blue"&gt;bool&lt;/span&gt;
&lt;span style="color:teal"&gt;Predicate&lt;/span&gt;&lt;T&gt;(T obj);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In het kort komt dit dus op het volgende neer: aan FindAll geef je een delegate 
mee, welke wordt aangeroepen voor ieder item T in de List&lt;T&gt;. In de delegate kijk 
je of het meegegeven item voldoet aan een bepaalde eis, en je geeft true of false 
terug, al naar gelang de uitkomst. Hoewel deze functionaliteit nieuw is in C# 2.0, 
zal ik eerst even laten zien hoe je hem zou moeten gebruiken zonder anonymous methods:&lt;/p&gt;
&lt;p class="MsoNormal" style="text-autospace: none"&gt;
&lt;span lang="NL" style="font-size: 10.0pt; font-family: Courier New; color: teal"&gt;
List&lt;/span&gt;&lt;span lang="NL" style="font-size: 10.0pt; font-family: Courier New"&gt;&lt;&lt;span style="color:blue"&gt;string&lt;/span&gt;&gt; 
lijst = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:teal"&gt;List&lt;/span&gt;&lt;&lt;span style="color:blue"&gt;string&lt;/span&gt;&gt; 
{ &lt;span style="color:maroon"&gt;"Dit"&lt;/span&gt;, &lt;span style="color:maroon"&gt;"is"&lt;/span&gt;,
&lt;span style="color:maroon"&gt;"een"&lt;/span&gt;, &lt;span style="color:maroon"&gt;"verzameling"&lt;/span&gt;,
&lt;span style="color:maroon"&gt;"strings"&lt;/span&gt; };&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-autospace: none"&gt;
&lt;span lang="NL" style="font-size: 10.0pt; font-family: Courier New"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-autospace: none"&gt;
&lt;span style="font-size: 10.0pt; font-family: Courier New; color: teal"&gt;List&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New"&gt;&lt;&lt;span style="color:blue"&gt;string&lt;/span&gt;&gt; 
newLijst = lijst.FindAll(ValidateString);&lt;br&gt;
&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New; color: blue"&gt;foreach&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New"&gt;(
&lt;span style="color:blue"&gt;string&lt;/span&gt; s &lt;span style="color:blue"&gt;in&lt;/span&gt; newLijst 
) {&lt;br&gt;
    &lt;span style="color:teal"&gt;Console&lt;/span&gt;.WriteLine(s);&lt;br&gt;
}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;De delegate ValidateString ziet er als volgt uit:&lt;/p&gt;
&lt;p class="MsoNormal" style="text-autospace: none"&gt;
&lt;span style="font-size: 10.0pt; font-family: Courier New; color: blue"&gt;public&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New"&gt;
&lt;span style="color:blue"&gt;static&lt;/span&gt; &lt;span style="color:blue"&gt;bool&lt;/span&gt; ValidateString(&lt;span style="color:blue"&gt;string&lt;/span&gt; 
s)  {&lt;br&gt;
    &lt;span style="color:blue"&gt;return&lt;/span&gt; (s.Length &gt; 3);&lt;br&gt;
}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Met andere woorden: we lopen door een lijst van strings heen, en geven een subset 
daaruit terug, bestaande uit strings met een lengte van meer dan 3. Het resultaat 
zal dan ook zijn "verzameling" en "strings". &lt;/p&gt;
&lt;p&gt;In C#2.0 hebben we anonymous methods. Dit betekent dat we bovenstaande code kunnen 
schrijven &lt;i&gt;zonder&lt;/i&gt; de ValidateString() method te maken. Dat gaat als volgt:&lt;/p&gt;
&lt;p class="MsoNormal" style="text-autospace: none"&gt;
&lt;span lang="NL" style="font-size: 10.0pt; font-family: Courier New; color: teal"&gt;
List&lt;/span&gt;&lt;span lang="NL" style="font-size: 10.0pt; font-family: Courier New"&gt;&lt;&lt;span style="color:blue"&gt;string&lt;/span&gt;&gt; 
lijst = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:teal"&gt;List&lt;/span&gt;&lt;&lt;span style="color:blue"&gt;string&lt;/span&gt;&gt; 
{ &lt;span style="color:maroon"&gt;"Dit"&lt;/span&gt;, &lt;span style="color:maroon"&gt;"is"&lt;/span&gt;,
&lt;span style="color:maroon"&gt;"een"&lt;/span&gt;, &lt;span style="color:maroon"&gt;"verzameling"&lt;/span&gt;,
&lt;span style="color:maroon"&gt;"strings"&lt;/span&gt; };&lt;br&gt;
&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New; color: teal"&gt;
&lt;br&gt;
List&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New"&gt;&lt;&lt;span style="color:blue"&gt;string&lt;/span&gt;&gt; 
newLijst = lijst.FindAll(&lt;span style="color:blue"&gt;delegate&lt;/span&gt;(&lt;span style="color:blue"&gt;string&lt;/span&gt; 
s) { &lt;span style="color:blue"&gt;return&lt;/span&gt; (s.Length &gt; 3);});&lt;br&gt;
&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New; color: blue"&gt;foreach&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New"&gt;(
&lt;span style="color:blue"&gt;string&lt;/span&gt; s &lt;span style="color:blue"&gt;in&lt;/span&gt; newLijst 
) {&lt;br&gt;
    &lt;span style="color:teal"&gt;Console&lt;/span&gt;.WriteLine( s );&lt;br&gt;
}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Zoals je ziet hebben we de delegate niet meer nodig: de code daarvoor staat in 
de lijst.Findall() aanroep. Uiteraard is dit alleen handig indien de code in de 
delegate niet al te groot is; anders kun je beter een aparte method gebruiken.&lt;/p&gt;
&lt;p&gt;In C# 3.0 kunnen we dit nog vereenvoudigen, met behulp van type inferrence en 
lambda expressions:&lt;/p&gt;
&lt;p class="MsoNormal" style="text-autospace: none"&gt;
&lt;span lang="NL" style="font-size: 10.0pt; font-family: Courier New; color: blue"&gt;
var&lt;/span&gt;&lt;span lang="NL" style="font-size: 10.0pt; font-family: Courier New"&gt; lijst 
= &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:teal"&gt;List&lt;/span&gt;&lt;&lt;span style="color:blue"&gt;string&lt;/span&gt;&gt; 
{ &lt;span style="color:maroon"&gt;"Dit"&lt;/span&gt;, &lt;span style="color:maroon"&gt;"is"&lt;/span&gt;,
&lt;span style="color:maroon"&gt;"een"&lt;/span&gt;, &lt;span style="color:maroon"&gt;"verzameling"&lt;/span&gt;,
&lt;span style="color:maroon"&gt;"strings"&lt;/span&gt; };&lt;br&gt;
&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New; color: blue"&gt;
&lt;br&gt;
var&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New"&gt; newLijst = 
lijst.FindAll((&lt;span style="color:blue"&gt;string&lt;/span&gt; s) =&gt; (s.Length &gt; 3));&lt;br&gt;
&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New; color: blue"&gt;foreach&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New"&gt;(
&lt;span style="color:blue"&gt;var&lt;/span&gt; s &lt;span style="color:blue"&gt;in&lt;/span&gt; newLijst 
) {&lt;br&gt;
    &lt;span style="color:teal"&gt;Console&lt;/span&gt;.WriteLine( s );&lt;br&gt;
}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Door het gebruik van het 'var' keyword en de lambda expressie&lt;span style="font-size: 10.0pt; font-family: Courier New"&gt;(&lt;span style="color:blue"&gt;string&lt;/span&gt; 
s) =&gt; (s.Length &gt; 3)&lt;/span&gt;is de code een stuk overzichtelijker geworden.&lt;/p&gt;
&lt;p&gt;Dit is voorlopig de laatste posting over de nieuwe features in de taal C# 3.0. 
Volgende keer zal ik alles wat ik in de afgelopen 5 postings gedemonstreerd heb 
samenvoegen in een overzicht van Linq. &lt;/p&gt;
&lt;p&gt;Even in het kort: Linq staat voor Language Integrated Query, een manier om queries 
op te bouwen in je C# code. Dit is mogelijk doordat C# uitgebreid is met alle mogelijkheden 
die ik tot nu toe heb laten zien. &lt;/p&gt;
&lt;p&gt;Dus als je je afvraagt waar dit hele verhaal naar toe gaat, hou mijn blog in 
de gaten en zie het allemaal samen komen in mijn bespreking van Linq, DLinq en XLing!&lt;/p&gt;&lt;img src ="http://blogger.xs4all.nl/detrio00/aggbug/62488.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Dennis Vroegop</dc:creator><title>Nog meer tijdsbesparing (De toekomst van C#, deel 4)</title><link>http://blogger.xs4all.nl/detrio00/archive/2005/10/08/62367.aspx</link><pubDate>Sat, 08 Oct 2005 19:52:00 GMT</pubDate><guid>http://blogger.xs4all.nl/detrio00/archive/2005/10/08/62367.aspx</guid><wfw:comment>http://blogger.xs4all.nl/detrio00/comments/62367.aspx</wfw:comment><comments>http://blogger.xs4all.nl/detrio00/archive/2005/10/08/62367.aspx#Feedback</comments><slash:comments>31</slash:comments><wfw:commentRss>http://blogger.xs4all.nl/detrio00/comments/commentRss/62367.aspx</wfw:commentRss><trackback:ping>http://blogger.xs4all.nl/detrio00/services/trackbacks/62367.aspx</trackback:ping><description>&lt;p&gt;Dit keer ga ik het hebben over 2 onderwerpen die nieuw zijn in C# 3.0. Die twee 
dingen zijn: initializers en anonymous types.&lt;/p&gt;
&lt;p&gt;&lt;font size="5"&gt;Initializers&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Laat ik beginnen met een code-voorbeeld:&lt;/p&gt;
&lt;p class="MsoNormal" style="text-autospace: none"&gt;
&lt;span style="font-size: 10.0pt; font-family: Courier New; color: blue"&gt;class&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New"&gt;
&lt;span style="color:teal"&gt;Point&lt;/span&gt; {&lt;br&gt;
    &lt;span style="color:blue"&gt;private&lt;/span&gt;
&lt;span style="color:blue"&gt;int&lt;/span&gt; _x;&lt;br&gt;
    &lt;span style="color:blue"&gt;private&lt;/span&gt;
&lt;span style="color:blue"&gt;int&lt;/span&gt; _y;&lt;br&gt;
 &lt;br&gt;
    &lt;span style="color:blue"&gt;public&lt;/span&gt;
&lt;span style="color:blue"&gt;int&lt;/span&gt; X {&lt;br&gt;
        &lt;span style="color:blue"&gt;get&lt;/span&gt; {
&lt;span style="color:blue"&gt;return&lt;/span&gt; _x; }&lt;br&gt;
        &lt;span style="color:blue"&gt;set&lt;/span&gt; { 
_x = &lt;span style="color:blue"&gt;value&lt;/span&gt;; }&lt;br&gt;
    }&lt;br&gt;
 &lt;br&gt;
    &lt;span style="color:blue"&gt;public&lt;/span&gt;
&lt;span style="color:blue"&gt;int&lt;/span&gt; Y {&lt;br&gt;
        &lt;span style="color:blue"&gt;get&lt;/span&gt; {
&lt;span style="color:blue"&gt;return&lt;/span&gt; _y; }&lt;br&gt;
        &lt;span style="color:blue"&gt;set&lt;/span&gt; { 
_y = &lt;span style="color:blue"&gt;value&lt;/span&gt;; }&lt;br&gt;
    }&lt;br&gt;
}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Als we in onze code nu een instance willen maken van Point, dan doen we dat dus 
zo:&lt;/p&gt;
&lt;p class="MsoNormal" style="text-autospace: none"&gt;
&lt;span style="font-size: 10.0pt; font-family: Courier New; color: teal"&gt;Point&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New"&gt; 
myPoint = &lt;span style="color:blue"&gt;new&lt;/span&gt; MyPoint();&lt;br&gt;
myPoint.X = 42;&lt;br&gt;
myPoint.Y = 32;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Natuurlijk kunnen we een extra constructor maken die de waardes van X en Y instelt, 
maar in C# 3.0 kan dat ook op een andere manier. Dat ziet er dan zo uit:&lt;/p&gt;
&lt;p class="MsoNormal" style="text-autospace: none"&gt;
&lt;span style="font-size: 10.0pt; font-family: Courier New; color: teal"&gt;Point&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New"&gt; 
myPoint = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:teal"&gt;Point&lt;/span&gt;{X=42, 
Y=32};&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;En dat maakt het leven een stuk overzichtelijker! Overigens hoef je niet alle 
properties of public fields mee te geven, alleen de X bijvoorbeeld had ook gekund. 
Ook de volgorde maakt niet uit, de velden zijn immers benoemd dus de compiler vindt 
wel waar alles heen moet.&lt;/p&gt;
&lt;p&gt;Dit trucje kunnen we ook uithalen met Collections. Het is bekend dat we bijvoorbeeld 
een array direct kunnen vullen bij het declareren van de variabele:&lt;/p&gt;
&lt;p class="MsoNormal" style="text-autospace: none"&gt;
&lt;span lang="NL" style="font-size: 10.0pt; font-family: Courier New; color: blue"&gt;
string&lt;/span&gt;&lt;span lang="NL" style="font-size: 10.0pt; font-family: Courier New"&gt;[] 
stringArray = { &lt;span style="color:maroon"&gt;"Dit"&lt;/span&gt;,
&lt;span style="color:maroon"&gt;"zijn"&lt;/span&gt;, &lt;span style="color:maroon"&gt;"een"&lt;/span&gt;,
&lt;span style="color:maroon"&gt;"stelletje"&lt;/span&gt;, &lt;span style="color:maroon"&gt;"strings."&lt;/span&gt;
&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New"&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Dat kan nu dus ook met collection classes. Eerst even de pre-c# 3.0 code:&lt;/p&gt;
&lt;p class="MsoNormal" style="text-autospace: none"&gt;
&lt;span style="font-size: 10.0pt; font-family: Courier New; color: teal"&gt;List&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New"&gt;&lt;&lt;span style="color:blue"&gt;string&lt;/span&gt;&gt; 
stringList = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:teal"&gt;List&lt;/span&gt;&lt;&lt;span style="color:blue"&gt;string&lt;/span&gt;&gt;();&lt;br&gt;
&lt;/span&gt;&lt;span lang="NL" style="font-size: 10.0pt; font-family: Courier New"&gt;stringList.Add(&lt;span style="color:maroon"&gt;"Dit"&lt;/span&gt;);&lt;br&gt;
stringList.Add(&lt;span style="color:maroon"&gt;"zijn"&lt;/span&gt;);&lt;br&gt;
stringList.Add(&lt;span style="color:maroon"&gt;"een"&lt;/span&gt;);&lt;br&gt;
&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New"&gt;stringList.Add(&lt;span style="color:maroon"&gt;"stelletje"&lt;/span&gt;);&lt;br&gt;
stringList.Add(&lt;span style="color:maroon"&gt;"strings."&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Ziet er bekend uit, niet waar? Een hoop werk, en nogmaals: daar houden we niet 
zo van. Dus in C#3.0 ziet het er als volgt uit:&lt;/p&gt;
&lt;p class="MsoNormal" style="text-autospace: none"&gt;
&lt;span lang="NL" style="font-size: 10.0pt; font-family: Courier New; color: blue"&gt;
var&lt;/span&gt;&lt;span lang="NL" style="font-size: 10.0pt; font-family: Courier New"&gt; stringList 
= &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:teal"&gt;List&lt;/span&gt;&lt;&lt;span style="color:blue"&gt;string&lt;/span&gt;&gt;{&lt;span style="color:maroon"&gt;"Dit"&lt;/span&gt;,
&lt;span style="color:maroon"&gt;"zijn"&lt;/span&gt;, &lt;span style="color:maroon"&gt;"een"&lt;/span&gt;,
&lt;span style="color:maroon"&gt;"stelletje"&lt;/span&gt;, &lt;span style="color:maroon"&gt;"strings."&lt;/span&gt;
&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New"&gt;};&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Dat is een stuk korter, overzichtelijker en duidelijker. Let ook op het gebruik 
van de 'var'. De compiler kan hier immers aan de new List&lt;string&gt; afleiden wat stringList 
voor een type moet zijn, dus dat hoeven we niet nog een keer aan te geven. &lt;/p&gt;
&lt;p&gt;&lt;font size="5"&gt;Anonymous types&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;We hebben gezien hoe we een object makkelijker kunnen instantieren. Kijk nu eens 
naar de volgende code:&lt;/p&gt;
&lt;p class="MsoNormal" style="text-autospace: none"&gt;
&lt;span style="font-size: 10.0pt; font-family: Courier New; color: blue"&gt;var&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New"&gt; 
someType = &lt;span style="color:blue"&gt;new&lt;/span&gt; {Naam=&lt;span style="color:maroon"&gt;"Dennis"&lt;/span&gt;, 
EMail=&lt;span style="color:maroon"&gt;"dvroegop@detrio.nl"&lt;/span&gt;, Huisnummer=42, Salaris=7800.00};&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Dit is uiteraard een fictief voorbeeld: dat salaris ligt in werkelijkheid een 
stukje hoger.&lt;/p&gt;
&lt;p&gt;Een quiz. Wat voor een type is sometype? Als het goed is, kan de compiler zelf 
bepalen wat voor een type het is, door te kijken wat er na de '=' staat. Dat is 
immers wat het 'var' keyword betekend. Maar... er staat niet zo veel achter het 
'=' teken, behalve het 'new' keyword en een initializer. Wat voor een type is dit 
nou?&lt;/p&gt;
&lt;p&gt;Het antwoord daarop is: maakt dat wat uit? Ik kan je wel vertellen dat de compiler 
nu een class aanmaakt, maar hoe die precies heet weten we niet. De code die de compiler 
nu genereert ziet er ongeveer als volgt uit:&lt;/p&gt;
&lt;p class="MsoNormal" style="text-autospace: none"&gt;
&lt;span style="font-size: 10.0pt; font-family: Courier New; color: blue"&gt;class&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New"&gt;
&lt;span style="color:teal"&gt;__newType&lt;/span&gt; {&lt;br&gt;
    &lt;span style="color:blue"&gt;private&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt; 
_Naam = &lt;span style="color:maroon"&gt;"Dennis"&lt;/span&gt;;&lt;br&gt;
    &lt;span style="color:blue"&gt;private&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt; 
_EMail = &lt;span style="color:maroon"&gt;"&lt;a href="mailto:dvroegop@detrio.nl"&gt;dvroegop@detrio.nl&lt;/a&gt;"&lt;/span&gt;;&lt;br&gt;
    &lt;span style="color:blue"&gt;private&lt;/span&gt; &lt;span style="color:blue"&gt;int&lt;/span&gt; 
_Huisnummer = 42;&lt;br&gt;
    &lt;span style="color:blue"&gt;private&lt;/span&gt; &lt;span style="color:blue"&gt;double&lt;/span&gt; 
_Salaris = 7800.00;&lt;br&gt;
 &lt;br&gt;
  &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt; 
Naam {&lt;br&gt;
      &lt;span style="color:blue"&gt;get&lt;/span&gt; { &lt;span style="color:blue"&gt;return&lt;/span&gt; 
_Naam; }&lt;br&gt;
      &lt;span style="color:blue"&gt;set&lt;/span&gt; { _Naam = &lt;span style="color:blue"&gt;
value&lt;/span&gt;; }&lt;br&gt;
  }&lt;br&gt;
 &lt;br&gt;
  &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt; 
EMail {&lt;br&gt;
      &lt;span style="color:blue"&gt;get&lt;/span&gt; { &lt;span style="color:blue"&gt;return&lt;/span&gt; 
_EMail; }&lt;br&gt;
      &lt;span style="color:blue"&gt;set&lt;/span&gt; { _EMail = &lt;span style="color:blue"&gt;
value&lt;/span&gt;; }&lt;br&gt;
  }&lt;br&gt;
 &lt;br&gt;
  &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;int&lt;/span&gt; 
Huisnummer {&lt;br&gt;
      &lt;span style="color:blue"&gt;get&lt;/span&gt; { &lt;span style="color:blue"&gt;return&lt;/span&gt; 
_Huisnummer; }&lt;br&gt;
      &lt;span style="color:blue"&gt;set&lt;/span&gt; { _Huisnummer =
&lt;span style="color:blue"&gt;value&lt;/span&gt;; }&lt;br&gt;
  }&lt;br&gt;
 &lt;br&gt;
  &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;double&lt;/span&gt; 
Salaris {&lt;br&gt;
      &lt;span style="color:blue"&gt;get&lt;/span&gt; { &lt;span style="color:blue"&gt;return&lt;/span&gt; 
_Salaris;}&lt;br&gt;
      &lt;span style="color:blue"&gt;set&lt;/span&gt; { _Salaris = &lt;span style="color:blue"&gt;
value&lt;/span&gt;; }&lt;br&gt;
  }&lt;br&gt;
}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;en even verderop:&lt;/p&gt;
&lt;p class="MsoNormal" style="text-autospace: none"&gt;
&lt;span style="font-size: 10.0pt; font-family: Courier New; color: teal"&gt;__newType&lt;/span&gt;&lt;span style="font-size: 10.0pt; font-family: Courier New"&gt; 
someType;&lt;br&gt;
someType = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:teal"&gt;__newType&lt;/span&gt;();&lt;br&gt;
 &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-autospace: none"&gt;
De waardes hoeven niet meer geinitialiseerd te worden, die staan immers in de 
class. In werkelijkheid ziet het er iets anders uit, maar voor dit moment is dit goed 
genoeg. Er wordt dus een anoniem type aangemaakt waarvan we de naam niet kennen, 
maar hij wordt wel aangemaakt met de juiste velden er in. Dus na de uitbreiding 
met anonymous methods in C#2.0 hebben we nu zelfs anonymous types. Voor je het weet 
komen ze met anonymous applications, maar dat zal wel niet zo snel gebeuren.&lt;/p&gt;
&lt;p&gt;Volgende keer: lambda expressions!&lt;/p&gt;&lt;img src ="http://blogger.xs4all.nl/detrio00/aggbug/62367.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Dennis Vroegop</dc:creator><title>Laten we gaan uitbreiden! (De toekomst van C# deel 3)</title><link>http://blogger.xs4all.nl/detrio00/archive/2005/10/07/62275.aspx</link><pubDate>Fri, 07 Oct 2005 22:25:00 GMT</pubDate><guid>http://blogger.xs4all.nl/detrio00/archive/2005/10/07/62275.aspx</guid><wfw:comment>http://blogger.xs4all.nl/detrio00/comments/62275.aspx</wfw:comment><comments>http://blogger.xs4all.nl/detrio00/archive/2005/10/07/62275.aspx#Feedback</comments><slash:comments>32</slash:comments><wfw:commentRss>http://blogger.xs4all.nl/detrio00/comments/commentRss/62275.aspx</wfw:commentRss><trackback:ping>http://blogger.xs4all.nl/detrio00/services/trackbacks/62275.aspx</trackback:ping><description>&lt;P&gt;Heb jij dat nou ook wel eens? Je krijgt van een collega een assembly met daarin een aantal classes die je in je eigen C# applicatie moet gaan gebruiken. En die classes zijn best ok, maar als ze nou net dat ene stukje functionaliteit erbij zouden hebben, of net die ene method zouden ondersteunen, dan zouden ze fantastisch zijn. Maar ja... binnen je organisatie ben jij de enige die fantastische code oplevert en de rest is maar zo-zo, dus die assembly is niet precies wat je nodig hebt.&lt;/P&gt;
&lt;P&gt;Lastig.&lt;/P&gt;
&lt;P&gt;Nou hoeft dat in theorie in een object geori&amp;#235;nteerde taal als C# helemaal geen probleem te zijn. Immers, een van de voordelen van OO is dat alles herbruikbaar en uitbreidbaar is. Je neemt de class van je collega, leidt er een subclass van af, voegt de juiste functionaliteit aan toe en je bent klaar! Of toch niet?&lt;/P&gt;
&lt;P&gt;Nou nee. Het werkt wel zo, maar het is niet de meest praktische methode. Tenminste, niet altijd. Neem bijvoorbeeld de volgende classes:&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Courier New"&gt;namespace&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt; LameClasses {&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;abstract&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: teal"&gt;Person&lt;/SPAN&gt; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// some stuff&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: teal"&gt;Customer&lt;/SPAN&gt; : &lt;SPAN style="COLOR: teal"&gt;Person&lt;/SPAN&gt; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// other stuff&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: teal"&gt;Employee&lt;/SPAN&gt; : &lt;SPAN style="COLOR: teal"&gt;Person&lt;/SPAN&gt; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// and yet more stuff&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Allemaal leuk en aardig, maar in jouw applicatie heb je code nodig die wat statistische gegevens ophoest van Employee en van Customer. De plek om dat te doen is uiteraard in Person, maar wat als je daar niets aan kunt veranderen? Heb je bijvoorbeeld alleen de dll gekregen en niet de source-code? Of heb je wel de source-code erbij gekregen maar wordt de assembly op dat moment ook door anderen, die geen behoefte hebben aan jouw statistische code, gebruikt? In dat soort gevallen kun je Person niet aan gaan passen. Dus krijg je de volgende code:&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Courier New"&gt;namespace&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt; ReallyCoolStuff {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: teal"&gt;CoolCustomer&lt;/SPAN&gt;: Customer {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; DoSomeExcitingCode() {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// Put your brilliant code here&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: teal"&gt;CoolEmployee&lt;/SPAN&gt; : Employee {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; DoSomeExcitingCode() {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// Put the same brilliant code here again&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Tja... dit is ook geen oplossing, je bent immers dezelfde code twee keer aan het toevoegen. Ok, je kunt een derde class introduceren met daarin de code, en die code dan aanroepen vanuit CoolCustomer en CoolEmployee. Maar als iemand anders nou weer iets toe wil voegen? Krijgen we dan de class EvenCoolerCustomer, EvenCoolerEmployee enzovoorts? Ik hoop het toch niet!&lt;/P&gt;
&lt;P class=MsoNormal&gt;Nog even het probleem samengevat: hoe kan ik een class uitbreiden zonder aan de code van de originele class te komen en toch de nieuwe code zo duidelijk en toegankelijk mogelijk houden?&lt;/P&gt;
&lt;P class=MsoNormal&gt;Het C# team heeft daar een antwoord op: extensions.&lt;/P&gt;
&lt;P class=MsoNormal&gt;Kort gezegd: extensions zijn methods van een class die &lt;B&gt;buiten&lt;/B&gt; die class gedefinieerd zijn. Dat werkt als volgt. Denk nog even terug aan ons voorbeeld van Customer en Employee. We moeten daar dus een method DoSomeExcitingCode() aan toevoegen. Om dat te doen in C# 3.0, maak je een nieuwe static class aan (hij moet static zijn!) in een of andere namespace (maakt niet uit welke):&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Courier New"&gt;namespace&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt; MyExtensions {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: teal"&gt;MyExtensionClass&lt;/SPAN&gt; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Zo iets dus. Het maakt eigenlijk niet zo veel uit hoe de class heet, als je je maar aan de coding standards houdt die jouw organisatie hanteert. In deze class definieer je de methods die je aan de niet-perfecte classes wilt toevoegen. Zo dus:&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Courier New"&gt;namespace&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt; MyExtensions {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: teal"&gt;MyExtensionClass&lt;/SPAN&gt; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN lang=NL style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Courier New"&gt;public&lt;/SPAN&gt;&lt;SPAN lang=NL style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt; &lt;SPAN style="COLOR: blue"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; DoSomeExcitingCode() {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// Ah.. mijn briljante code is weer terug!&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Tot zover niets spannends, toch? Maar dit gaat niet werken. Nou ja, het gaat wel werken, maar het is nog geen extension. Om deze method nou aan de Person class toe te voegen (en dat willen we immers) moeten we de signature enigzins aanpassen:&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Courier New"&gt;namespace&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt; MyExtensions {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: teal"&gt;MyExtensionClass&lt;/SPAN&gt; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; DoSomeExcitingCode(&lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt; Person person) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN lang=NL style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: Courier New"&gt;// Doe hier iets met person...&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN lang=NL style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;In de body van DoSomeExcitingCode kun je nu aan de slag gaan met person. Maar nu wordt het leuk: zorg ervoor dat de alle namespaces in de using clause heb staan (in mijn voorbeeld dus LameClasses en MyExtensions) en dan:&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN lang=NL style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Courier New"&gt;var&lt;/SPAN&gt;&lt;SPAN lang=NL style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt; medewerker = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: teal"&gt;Employee&lt;/SPAN&gt;();&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN lang=NL style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: Courier New"&gt;// En hier komt de magie:&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt;medewerker.DoSomeExcitingCode();&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;(als je die 'var' niet begrijpt, lees dan mijn vorige posting in mijn blog)&lt;/P&gt;
&lt;P class=MsoNormal&gt;Mmmm.. We roepen DoSomeExcitingCode() aan op het object medewerker, van de class Employee, maar... in de definitie van Employee komt die hele method niet voor!&amp;nbsp; Nee, dat klopt dus. Met het gebruik van 'this Person person' in de parameter lijst van de extension method hebben we aangegeven dat deze method gebruikt mag worden bij alle instances van Person (of afgeleiden!)&lt;/P&gt;
&lt;P class=MsoNormal&gt;Let echter op: het is erg verleidelijk om dit soort code te gaan schrijven:&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Courier New"&gt;public&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt; &lt;SPAN style="COLOR: blue"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: teal"&gt;SuperExtensions&lt;/SPAN&gt; {&lt;BR&gt;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt;[] GetAllPrivateFields(&lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;object&lt;/SPAN&gt; obj) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN lang=NL style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: Courier New"&gt;// Ga met reflection door alle private fields heen en geef&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN lang=NL style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// die terug in de string[]... :(&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt;}&lt;BR&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;En nu kun je in alle code, waar je de namespace in je using heb staan waar deze class in staat, GetAllPrivateFields() aanroepen. Want je hebt een uitbreiding op object gemaakt, en aangezien alles van object (inclusief int, bool, char enzovoorts!!!) is afgeleid kun je nu overal deze method toepassen!&lt;/P&gt;
&lt;P class=MsoNormal&gt;Dat komt de leesbaarheid en onderhoudbaarheid van je code niet ten goede. Dus gebruik extensions spaarzaam!&lt;/P&gt;
&lt;P class=MsoNormal&gt;Volgende keer meer over nog meer mogelijkheden in C# 3.0!&lt;/P&gt;&lt;img src ="http://blogger.xs4all.nl/detrio00/aggbug/62275.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>
