Alweer bijna 2 weken geleden dat ik het laatste deel van de C# Jump Start Video heb gezien. Vorige week bezig geweest met een .NET project en het koppelen met de API van Fitbit. Daar zit ik nog midden in, omdat ik voortgang in mijn voorbereiding voor de certificering wil houden ben ik in de voorbeeldcode van http://xaml.codeplex.com gedoken.
Je download daar een zip-bestand van 209 MB. Hierna even per onderdeel doorlopen. In het zip-bestand heb je een map sourceCode waar het zip-bestand sourceCode.zip staat. Dat heb ik uitgepakt, is uiteindelijk 76.5 MB aan bestanden. Zo te zien staat in de map MVA\201303_CSharp de code die ook in de Jump Start Video gebruikt wordt.
Ik begin bij "het begin", dus in de eerste map, "Blog". Je ziet hier 35 mappen met losse projecten, gedateerd van 2013 t/m 2015. De bovenste map is "201310-Facebook". Bij het openen blijkt deze onder source-control te staan (negeren) en hierna blijkt dat het project niet meer compatible is met Visual Studio 2017. Wat zaken getest, maar ik zou de hele boel om moeten bouwen om het werkend te krijgen, niet mijn idee om "even snel wat voor de studie te doen".
Ik open daarom maar de solution in de map \MVA\201305_XamlBeginner. Lijkt qua structuur wel op wat in de map \MVA\201303_CSharp staat, maar gezien de mapnaam zal deze nieuwer zijn. Dit project lijkt namelijk op wat de mannen in de Jump Start Video gebruiken om de demo's te tonen. Bij het openen gaat Visual Studio 2017 de code bijwerken, bijna alles kan bijgewerkt worden, behalve het project After035_CS en After035_WinMD. Tot zover de conversie. Daarna build ik de solution. Hier krijg ik nog 2 foutmeldingen, After001 - Class structures, hierin kan een string niet naar int geconverteerd worden, dat klopt, want dat was ook in de demo volgens mij te zien (je hebt een List met strong type int, als je daar een "three" aan toe wilt voegen, dan kan dat niet. En After023 geeft een fout, omdat de klasse Dog die overerft van klasse Animal wel een SetName-functie heeft, maar deze niet het override-statement meegekregen heeft. Omdat in de base-class deze functie abstract is, moet je een override uitvoeren.
Ik loop alle projecten in deze solution door om te kijken of ik nog wat tegen kom wat niet in de video's benoemd is.
After002 - Class Inheritance
Er zit een fout in de code, Console.WriteLine("Animal has {0} legs and makes this sound: {1}", animal.NumberOfLegs);, er wordt hier namelijk geen 2e parameter meegegeven.
After004 - Reflection
Geen fout, maar wel een voorbeeld wat ik wil toelichten. Met reflectie worden de eigenschappen van een klasse bepaald. Dat wordt gedaan op basis van propertyInfo.Name.Equals("...."), dat is goed, maar ook via PropertyInfo numberOfLegs = properties[0];
Als je in de klasse vooraan een nieuwe eigenschap toe voegt, wordt hier dus de verkeerde eigenschap opgevraagd! Niet doen dus.
After016 - UI locks
Ik had al aangegeven dat de XAML-projecten niet echt wilden doen wat ik wilde, dit project is ook een XAML-project en werkt wel. Het laat zien hoe je een zware actie door kunt geven aan een background-proces, zodat de applicatie responsive blijft.
After017 - Threadpool and Callbacks
In deze kleine demo heb je een voorbeeld van Threadpool en Parallel. Volgens mij niet getoond bij de video's.
After019 - Async en await
Een mooi voorbeeld van hoe "oude" code zonder async en await redelijk cryptisch opgezet moet worden om het te laten werken (BackgroundWorker aanmaken, DoWork, etc.), terwijl je met async en await alleen die statements hoeft te gebruiken en daardoor redelijk "cleane code" over houdt.
After020 - Mutex
Dit item is volgens mij niet besproken bij de video's, maar is zeker een handig item. Als ik me niet vergis heeft mijn oud collega Sander Kalsbeek deze eigenschap ook in een .NET-project gebruikt. Met een mutex kun je afdwingen dat een programma maar 1 instantie draait. Dus niet dat per ongeluk het programma 20x op je pc draait en hierdoor je geheugen laat vollopen o.i.d. Ik bedenk me dat ik dit ook nog voor een project kan gebruiken, dus ter referentie nog even de code zoals die ook in het project draait. Testen? Build het project, ga in je Explorer naar de bin/debug map en start het exe-bestand. Start daarna vanuit Visual Studio het programma. Je zult dan de melding krijgen dat het programma al actief is.
using System;
using System.Threading;internal class Program
{
private static readonly string _appId = "BBA4993A-B60F-4740-B2E9-6F1144E1DF90";private static void Main(string[] args)
{
// The "Global\" prefix enforces only one instance of the app on terminal services too!
using (var mutex = new Mutex(false, @"Global\" + _appId))
{
if (!mutex.WaitOne(0, false))
{
Console.WriteLine("There already is one! Goodbye!");
return;
}// I only want one instance of this app to run on this machine!
var program = new Program();
program.Run();
}
}private void Run()
{
while (true)
{
Console.WriteLine("There can be only one!");
Thread.Sleep(500);
}
}
}
After020 - Semaphore
In deze oefening wordt gebruik gemaakt van een Semaphore, waarmee je de flow kunt blokkeren en weer verder laten lopen. Goed om even door te kijken.
De andere projecten zijn tijdens de video's wel behandeld. Binnenkort kijken of er nog andere aandachtspunten zijn die ik door moet nemen.