Posts

C# delegates Action en MethodInvoker

Beide delegates, Action en MethodInvoker, hebben dezelfde signature: public delegate void MethodInvoker(); public delegate void Action(); Syntactisch zijn ze dus hetzelfde, maar wanneer gebruik je dan welke? Dit antwoord wordt gegeven door de documentatie van Control.Invoke(); De delegate kan een instantie zijn van EventHandler. In dit geval bevat de sender parameter het control en de event parameter bevat EventArgs.Empty. De delegate kan ook instantie zijn van de MethodInvoker, of elke andere delegate die een lege parameter lijst heeft. Een aanroep naar EventHandler of MethodOnvoker delegate is sneller dan een aanroep naar een anderer type delegate Van de dikgedrukte tekst kan geconcludeerd worden dat er binnen de Invoke methode een is/as check plaatsvind en gebruik gemaakt wordt van Invoke, welke aanzienlijk sneller is dan DynamicInvoke.

C# Expression trees

Expression trees worden gebruikt in combinatie met LINQ. Een expression tree is een abstracte representatie van een lambda expressie. Een expression tree kan niet direct worden uitgevoerd. Met de compile() methode wordt in het geheugen de representatie gemaakt in de vorm van een object. Vervolgens kan via code de expressie worden benaderd. Zo gebuikt LINQ2SQL expression trees om de lambda code om te zetten naar een SQL querie. Dit is mogelijk omdat alle onderdelen (de nodes van de tree) van de lambda uitgelezen kunnen worden. Stel je deze lambda voor: x => x.Name == "Martijn" Deze expressie bevat een Body en de body bestaat uit de volgende onderdelen: Left property: Deze bevat de linkerkant van de expressie (x.Name) Right property: Deze bevat de rechterkant van de expressie ("Martijn") NodeType property: bevat de operatie die toegepast is op de twee expressies (==) Normaal gesproken (zeker bij uitgebreide lambda's) worden deze properties achterhaald d...

[Design patterns] Factory vs Builder pattern

Het verschil tussen de factory design pattern en de builder design pattern aan de hand van een voorbeeld. Denk even aan een restaurant. Het maken van de maaltijd van de dag is een factory pattern. Je zegt namelijk tegen de keuken 'geef mij de maaltijd van vandaag' en de keuken/factory bepaalt welk object er gegenereerd moet worden, gebaseerd op de verborgen criteria. De builder pattern komt naar voren bij bijvoorbeeld het bestellen van een pizza. In dit geval verteld de ober de kok 'Ik heb een pizza nodig met kaas, uien en ham'. Dus, de builder stelt de attributen beschikbaar die het gegenereerde object kan hebben maar verbergt hoe ze gezet moeten worden.

Managed vs Unmanaged code

"Unmanaged code" is een nieuwe naam voor een oud concept. Unmanaged code staat voor native machine code. Software kan geschreven zijn in hogere programmeertalen zoals Pascal, C of C++. Deze talen worden vertaald naar machine code (=unmanaged code) door de compiler. De gegenereerde code wordt direct op de host van de processor uitgevoerd. Dit houdt in dat de processor direct de code uitvoert die is gegenereerd door de compiler. Deze aanpak resulteert in een snelle uitvoer van de code, maar het analyseren en opvangen van fouten gaat makkelijker in managed code. Managed code is een nieuwe naam, maar het concept is al oud. "Managed code" staat tegenwoordig voor het systeem dat gebruik maakt van het Microsoft .NET Framework, maar .NET is gewoon een voorbeeld van een managed code systeem. Het .NET systeem accepteert broncode van ondersteunende talen zoals C, C++, C#, Pascal en nog meer. Deze code wordt vertaald in code die ontworpen is voor een virtuele machine. De echte ...

[C#] Application.Run()

Application.Run(new Form1()) doet drie dingen Maak form1 zichtbaar Voorzie form1 met een close event handler, zodat wanneer form1 sluit, Application.Exit() wordt aangeroepen. Start een message loop De belangrijkste reden om Application.Run() te gebruiken is zodat er dan een message loop wordt gestart ( Message loop ).

Message loop of message pump

De message loop of message pump is een klein stukje code dat in elk Windows programma bestaat dat een GUI heeft. De console applicatie heeft dus geen message pool.Een GUI applicatie werkt met berichten (messages). Wanneer bijvoorbeeld de muis wordt bewogen, verstuurd Windows een WM_MOUSEMOVE bericht naar het onderliggen window. De Win32Message API ontvangt berichten van Windows. Elk programma spendeert 99,99% van zijn tijd daar, te wachten totdat Windows zegt dat er iets interessants is gebeurd. Windows verstuurt de berichten naar de 'message queue' (berichten wachtrij) van de thread waar de window toe behoort. Er moet dus iets zijn dat deze berichten doorstuurt naar de juist window. Dit werk wordt gedaan door de message loop of message pump. Elke Windows GUI framework heeft een message loop. De eenvoudigste message loop ziet er als volgt uit (in C++, gebruik interop om te schrijven in .NET) MSG msg; while(GetMessage(&msg, hwnd, 0, 0)) { TranslateMessage(&msg); ...

Hoofdstuk 16 - Les 1

Met 2 properties kan de culture gezet worden: Thread.CurrentThread.CurrentCulture - Bepaalt de resultaten van cultuur afhankelijke functies zoals tijd/datum notatie, getallen en valuta opmaak. CurrentCulture moet gezet worden in taal-regionale: ex-MX, fr-FR. Enkel een neutrale taal opgeven kan niet. Thread.CurrentThread.CurrentUICulture - Bepaalt welke resources er geladen moeten worden door de resource manager. Hier kan zowel een neutrale taal worden opgegeven als specifieke culturen. Deze properties dienen te worden gezet door een instantie van CultureInfo: Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES"); Thread.CurrentThread.CurrentUICulture = new CultureInfo("es-ES"); MessageBox.Show(Thread.CurrentThread.CurrentCulture>ToString()); double d = 1234567.89; MessageBox.Show(d.ToString("C")); MessageBox.Show(DateTime.Now.ToString()); // Output: es-ES 1.234.567, 89 € 17/08/2010 11:07:46 Met de System.Globalization.CultureInfo.GetCultures m...