n00b pro

00. Visual Studio

Dit hoofdstuk is onderdeel van de cursus Ontwikkelomgeving. Andere cursussen in dezelfde reeks: HTML, CSS, Javascript, C#.

Wat is programmeren

.NET Framework

Als je programmeert, maak je altijd gebruik van bundel vooraf geschreven code waarop je kan voortbouwen. Het zou niet handig zijn als je bij elk programma opnieuw knoppen, dialoogvensters, scrollbars enz... vanaf nul moet programmeren! Een dergelijke bundel noemt men een framework.

Frameworks bestaan in veel gebieden:

In deze cursus gebruiken we het .NET Framework: het is weliswaar voornamelijk gericht op Windows apps, maar ook op mobiele (Android bv) of cloud toepassingen. Het werkt bovendien naadloos samen met C#.

Fasen van een programma

Een programma is een opeenvolging van instructies die in een bepaalde volgorde worden uitgevoerd. De verschillende fasen van een programma:

  1. programma schrijven, bv. in C#
  2. code compileren: code wordt omgezet naar platform-onafhankelijke Common Intermediate Language (CIL) bytecode, wat resulteert in een PE-file (Portable Executable)
  3. code uitvoeren: de .NET Common Language Runtime (CLR) vertaalt tijdens de uitvoering de bytecode in platform-specifieke machine-instructies

Soorten fouten

In elke fase van het programma kunnen fouten optreden:

  1. syntax error: je code bevat een fout tegen de vormregels van de programmeertaal, bv. puntkomma of haakje vergeten
  2. build error: je code is correct geschreven, maar tijdens het builden loopt iets fout, bv. een bibliotheek wordt niet gevonden
  3. runtime error: je code compileert netjes, maar tijdens het uitvoeren loopt je programma vast, bv. een onverwachte deling door nul, geheugenfout, bestand wordt niet gevonden enz...
  4. logical error: je programma loopt niet vast, maar doet niet wat je verwacht, bv. de output is verkeerd of een knop werkt niet

Integrated Development Environment (IDE)

De ontwikkelomgeving of Integrated Development Environment is de omgeving waarin je programma's ontwikkelt. Typische features van IDE's:

De meest gebruikte omgeving voor C# Visual Studio (versie 2022 op moment van schrijven).

Installatie Visual Studio

Downloaden

Download en installeer Visual Studio gratis vanop https://visualstudio.microsoft.com/free-developer-offers/ (Visual Studio Community)

Keuze workload

In Visual Studio kan je programmeren in verschillende talen (en zelfs meerdere tegelijk in één project): Javascript, Python, C++, Visual Basic, R, F#, C#... en voor verschillende platforms (Windows, Azure, Android, Web…). Daarom biedt Visual Studio een heel aantal verschillende standaardomgevingen, workload genoemd, met tools, omgeving enz... aangepast aan jouw specifieke ontwikkelingsbehoeften. Wij gebruiken de .NET desktop environment; let er dus op dat je de juiste omgeving kiest tijdens installatie.

kies voor .NET desktop development

Selecteren individuele componenten

Je kan tijdens installatie (of achteraf) individuele componenten kiezen, b.v. support voor oudere versies van .NET. Je kan dit deel voorlopig overslaan; individuele componenten kan je achteraf nog altijd selecteren via de Visual Studio installer.

selectie componenten (kan ook achteraf nog via Visual Studio installer)

Taalkeuze

Het is sterk aangeraden de taal van Visual Studio op Engels in te stellen. Dit maakt het b.v. makkelijker foutmeldingen op te zoeken, en de interface sluit dan aan bij de screenshots in deze cursus. Standaard wordt de taal van Windows gekozen; bij veel studenten zal dat Frans of Nederlands zijn. Verander dit naar Engels via Tools, Options, Environment, International Settings:

kies voor Engels

Staat Engels er niet tussen? Voeg het dan toe via de Visual Studio Installer.

Personaliseren

Thema veranderen

Pas het kleurschema aan via Tools, Theme:

pas kleurschema aan

Panels toevoegen

Voeg panels toe via View:

Panels pinnen

Pin/unpin panels zodat ze altijd zichtbaar/ingeklapt weergegeven worden:

Panels docken

Kiezen waar je een panel plaatst heet docken. Opties zijn links, boven, rechts, onder en centraal. Versleep eenvoudigweg het panel aan de bovenbalk naar een nieuwe plaats:

Solutions en projecten

Solution vs. project

Hoe code georganiseerd wordt in solutions en projecten hangt af van vak tot vak. Voor Introductie in Programmeren (ORP42a, graduaat) en OO Application Development (OBI25a, bachelors) wordt gekozen voor één solution per les, één project per oefening. Hieronder een screenshot van een typische les geopend in Visual Studio.

Je herkent:

Solution (=les) openen

In Visual Studio open je nooit een folder, maar een solution. Dit doe je door te dubbelklikken op het .sln solutionbestand van die les in verkenner:

Project (=oefening) toevoegen

Voor elke oefening voegen we een nieuw project toe aan de solution van die les. De eenvoudigste manier is met de rechtermuisknop op de solution, Add, New Project...:

In het volgende venster kan je kiezen uit heel veel projecttypes. In het volgende dialoogvenster je filtert best alvast op taal (C#) en platform (Windows):

Project types

In eerstejaarsvakken komen hoofdzakelijk deze twee types aan bod:

Op het einde van OO Application Development komt ook nog de class library aan bod, maar dat is voor dit hoofdstuk.

typische console app
typische WPF app

Console toepassingen hebben beperktere mogelijkheden dan WPF; daar staat tegenover dat je kan focussen op de essentie van leren programmeren. WPF toepassingen aan de andere kant laten toe snel een interface te bouwen met knoppen, menu's, sliders, date pickers enz... wat het dan weer makkelijker maakt complexere toepassingen te bouwen, al vraagt het meer kennis van Visual Studio. Sommigen studenten schrijven liever console toepassingen, anderen geven de voorkeur aan WPF, maar bij de meesten is er geen duidelijke voorkeur.

Wij zijn ervan overtuigd dat beide projecttypes elkaar aanvullen als manier om te leren programmeren.

Console Application

Een console applicatie draait dus in de console, i.e. een soort commandprompt-achtig venster. De mogelijkheden zijn beperkter dan bij WPF toepassingen, vooral grafische en UI componenten ontbreken. Enkele voorbeelden van wat wel/niet kan:

Aanmaken

Om een console toepassing te maken, open je eerst de solution van de les. Dan voeg je zoals steeds een project toe met Add, New Project...:

In het volgende venster kies je voor Console App:

Je vindt mogelijks nog andere versies zoals Console App (.NET Core) of Console App (.NET Framework). Dit zijn (sterk) verouderde types, die mag je niet gebruiken! Let er dus op dat het type exact is als op de screenshot.

Kies de naam van het project exact hetzelfde als de naam van de oefening:

In het laatste venster kies je voor de laatste versie, en duid aan dat je geen top-level statements wil:

Voorbeeld: ConsoleHalloWereld

Tenslotte kan je de code van het programma intypen:

Run het programma via F5 of deze knop:

Het programma in actie:

resultaat in de console

WPF Application

WPF staat voor Windows Presentation Foundation, een technologie van Microsoft om Windows toepassingen te bouwen. Ze hebben een grafische interface met knoppen, menu's, sliders, tekstvakken, afbeeldingen... en zijn daardoor visueel aantrekkelijker dan console applicaties. De mogelijkheden zijn dus uitgebreider dan Console toepassingen, maar de leercurve is ook steiler.

Aanmaken

Om een WPF toepassing te maken, open je weer eerst de solution van de les. Dan voeg je zoals steeds een project toe met Add, New Project...:

In het volgende venster kies je voor WPF Application:

Je vindt mogelijks nog andere versies zoals Windows Forms Application of WPF App (.NET Framework). Dit zijn (sterk) verouderde types, die mag je niet gebruiken! Let er dus op dat het type exact is als op de screenshot.

Kies de naam van het project exact hetzelfde als de naam van de oefening:

In het laatste venster kies je voor de laatste versie:

Designer

WPF toepassingen hebben twee aparte delen:

In de designer kan je controls toevoegen en properties instellen; de gegenereerde XAML (spreek uit: “zammel”) middenonder kan je ook rechtstreeks met de hand aanpassen of aanvullen.

Controls toevoegen

Een WPF component als Button, TextBox enz... toevoegen heet een WPF control. In het hoofdstuk WPF Controls komen we uitgebreid op terug op alle controls en hun gebruik. Voeg ze toe door verslepen uit de Toolbox:

Eigenschappen instellen

De volgende stap is het instellen van alle eigenschappen:

naam

Controls die je later nodig hebt, geef je best onmiddellijk een naam:

Controls als titels of vaste afbeeldingen die je niet nodig hebt in je programmeercode later, hoef je geen naam te geven.

We gebruiken de Hongaarse notatie: een drieletter prefix plus een omschrijving in PascalCase.
Voorbeelden: btnOk, inpNaam, txtError...

opmaak

Opmaakeigenschappen kan je via het properties panel instellen, of rechtstreeks in de XAML:

layout

Een correcte flexibele layout maken vraagt best wel wat kennis en werk; dit komt in een apart hoofdstuk 04. WPF layout aan bod. Maar voorlopig kunnen we perfect uit de voeten met slepen, en handmatig aanpassen van Padding en Margin. De makkelijkste plaats is rechtstreeks in de XAML. Gebruik zoveel mogelijk afgeronde waarden voor een mooie layout:

Events toevoegen

We willen uiteraard ook kunnen reageren op interacties met onze controls. Denk aan:

Er zijn meerdere soorten events mogelijk op controls, b.v. een Button kent zowel Click, MouseEnter als MouseLeave events. Het “meest logische” event is het standaardevent; bij de Button is dat Click. Voeg een standaardevent toe door dubbelklikken op de control, of kies een willekeurig ander event via de⚡knop van het properties panel:

event handler in XAML code in MainWindow.xaml

Het toevoegen van een event heeft twee effecten:

event handler implementatie in code-behind in MainWindow.xaml.cs
naam event handler aanpassen

De stijlregels (zie verder) vereisen dat alle namen van methodes met een hoofdletter beginnen. Pas daarom de naam aan zodat het begint met een hoofdletter:

Pas namen van variabelen, methodes e.d. nooit manueel aan maar altijd aan via Rename — zo ben je zeker dat de naam overal in je code (C#, XAML) correct aangepast wordt.

Code-behind

De code-behind, dus de “code achter het design”, is het eigenlijke programma. Je vindt het terug in MainWindow.xaml.cs:

Voorbeeld: WpfHalloWereld

Je zou nu in staat moeten zijn volgend WPF programma in elkaar te steken:

WpfHalloWorld design
WpfHalloWorld code-behind
resultaat

Media en andere bestanden toevoegen

Om bestanden als afbeeldingen of geluidsfragmenten toe te voegen aan je project, volg je deze stappen:

  1. maak een map aan in je project voor de media bestanden via Add, New Folder...
  2. drag drop de afbeeldingen in deze map uit verkenner
  3. selecteer bij de properties voor elke afbeelding bij Build Action Content en bij Copy to Output Directory Copy always:

Deze laatste stap mag je niet vergeten! Anders zullen je bestanden niet gevonden worden bij de uitvoering van je programma.

Solutions en projecten aanpassen

Bestaand project toevoegen of verplaatsen uit andere solution

Stappen:

  1. kopieer de projectmap naar de doelsolutionmap (als die er niet al in zit)
  2. voeg het project toe via rechtermuisknop, Add, Existing project... en selecteer het .csproj bestand van het project

Een video voor wie het graag eens gedemonstreerd ziet:

Project verwijderen

Als je een project wil verwijderen, moet je twee stappen ondernemen:

  1. verwijder het project uit de solution
  2. verwijder het project van de harde schijf

Een video voor wie het graag eens gedemonstreerd ziet:

Naam solution wijzigen

Volg deze stappen om de naam van een solution te wijzigen, b.v. van SlnOld naar SlnNew:

  1. sluit de solution
  2. hernoem de solution folder naar SlnNew
  3. hernoem het .sln bestand naar SlnNew.sln
  4. (voor de zekerheid) open de solution folder eens in VS Code (dus niet Visual Studio) en vervang met search/replace overal SlnOld door SlnNew
  5. heropen de solution, en rebuild het

Een video voor wie het graag eens gedemonstreerd ziet:

Naam project wijzigen

De naam van een project wijzigen vraagt best wel wat stappen. Een voorbeeld van WpfOld naar WpfNew:

  1. sluit de solution
  2. hernoem de project folder naar WpfNew
  3. hernoem het .csproj bestand naar SlnNew.csproj
  4. (voor de zekerheid) open de project folder eens in VS Code (dus niet Visual Studio) en vervang met search/replace overal WpfOld door WpfNew
  5. open de solution; het oude project WpfOld zal niet meer gevonden worden, verwijder die dus uit de solution
  6. voeg het nieuwe project WpfNew toe aan de solution
  7. hernoem in een willekeurig codebestand uit het project de namespace van WpfOld naar WpfNew
  8. rebuild het project

Een video voor wie het graag eens gedemonstreerd ziet (eerst voor een Console toepassing, dan nog eens voor een WPF toepassng):

StyleCop.Analyzers

Als programmeeur kan je eigenlijk niet zonder code analyse tools, denk maar aan b.v. html-validate voor HTML of StyleLint voor CSS. Features:

Installatie

Voor C# gebruiken we de StyleCop.Analyzers NuGet package. Voeg het toe aan je project via de NuGet package manager:

NuGet package manager

Zoek op “StyleCop.Analyzers” en vink alle projecten aan:

Installatie in alle projecten

Als je een nieuw project toevoegt, moet je opnieuw naar dit scherm om ook bij dit project StyleCop aan te vinken!

Configuratie

StyleCop.Analyzers heeft heel veel regels — teveel eigenlijk, zodat je massa's foutmeldingen krijgt. Gelukkig kan je de regels configureren met een .editorconfig in de solution map:

.editorConfig configuratiebestand in de solution

Dit bestand bevat alle configureerbare regels:

.editorConfig regels

Het is niet de bedoeling dat je zelf de regels gaat opstellen of veranderen. Voor elk vak zul je het configuratiebestand aangeleverd krijgen, zodat de regels voor alle studenten identiek zijn. Controleer gewoon of bestand aanwezig is, en zoniet, download het van Toledo en steek het in de solution.

Problemen oplossen

Je moet uiteraard niet alleen StyleCop installeren, maar ook effectief alle fouten en waarschuwingen oplossen:

StyleCop meldingen lezen

Debugging

Het stap voor stap doorlopen van je code, en ondertussen de waarden van properties en variabele in het oog houden, heet debugging.

Breekpunt(en) plaatsen

Plaats overal waar je de uitvoering van het programma wil pauzeren een breekpunt in de grijze balk links:

breekpunt plaatsen

Programma doorlopen

Doorloop dan stap voor stap je programma:

programma doorlopen

Variabelen inspecteren

Via de rechtermuisknop kan je een zgn. watch toevoegen aan een variabele:

watch toevoegen

Je kan dan de waarde van variabelen observeren tijdens het debuggen:

variabelen inspecteren

Een video voor wie het graag eens gedemonstreerd ziet:

Shortcuts

Typische Visual Studio shortcuts die je zou moeten kennen:

Shortcut Betekenis
Ctrl-K+D Document format
Ctrl-K+C, Ctrl-K+U Comment, Uncomment geselecteerd blok
F5 programma starten
Ctrl+F5 programma starten zonder debugging
F7 open code behind
Ctrl-Alt-=, Ctrl-Alt-- zoom design view in / uit

Nog enkele algemene shortcuts van elke tekst editor: