We gebruiken delen uit de volgende websites (zie BlackBoard voor de details):

Documentatie vs. Tutorials: java.String vs System.string

Visual Studio

  • Selecteer de juiste project-template
  • Kies de naam en de locatie (wat is een solution?)

VS Code


								> dotnet new console -lang "C#" -n "MijnProject" -o .
								> dotnet new sln -n "MijnSolution"
								> dotnet sln add "MijnProject.csproj"
							
  • Progam.cs
  • MijnProject.csproj
  • MijnSolution.sln
  • .vs
    • MijnProject
      • v16
        • .suo
  • obj
using System; namespace MijnProject { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); } } } <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.1</TargetFramework> </PropertyGroup> </Project> Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.26124.0 MinimumVisualStudioVersion = 15.0.26124.0 Project("{...GUID...}") = "MijnProject", "MijnProject.csproj", "{...GUID...}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {...GUID...}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {...GUID...}.Debug|Any CPU.Build.0 = Debug|Any CPU {...GUID...}.Debug|x64.ActiveCfg = Debug|Any CPU {...GUID...}.Debug|x64.Build.0 = Debug|Any CPU {...GUID...}.Debug|x86.ActiveCfg = Debug|Any CPU {...GUID...}.Debug|x86.Build.0 = Debug|Any CPU {...GUID...}.Release|Any CPU.ActiveCfg = Release|Any CPU {...GUID...}.Release|Any CPU.Build.0 = Release|Any CPU {...GUID...}.Release|x64.ActiveCfg = Release|Any CPU {...GUID...}.Release|x64.Build.0 = Release|Any CPU {...GUID...}.Release|x86.ActiveCfg = Release|Any CPU {...GUID...}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection EndGlobal d0cf11e0a1b11ae10000000000000000 00000000000000003e000300feff0900 06000000000000000000000001000000 0200000000000000001000000e000000 02000000feffffff0000000003000000 ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff fdfffffffeffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 52006f006f007400200045006e007400 72007900000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 16000500ffffffffffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000feffffff0000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000ffffffffffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000ffffffffffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000ffffffffffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 52006f006f007400200045006e007400 72007900000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 16000500ffffffffffffffff10000000 00000000000000000000000000000000 000000000000000000000000503c96a0 608bd6010f0000004020000000000000 500072006f006a0049006e0066006f00 45007800000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 16000201ffffffffffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000800000001000000000000000 58006d006c005000610063006b006100 670065004f007000740069006f006e00 73000000000000000000000000000000 00000000000000000000000000000000 24000201ffffffff1a000000ffffffff 00000000000000000000000000000000 00000000000000000000000000000000 000000007f0000000800000000000000 500072006f006a004500780070006c00 6f007200650072005300740061007400 65000000000000000000000000000000 00000000000000000000000000000000 24000200ffffffffffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000530000004d01000000000000 ffffffffffffffff04000000fdffffff 05000000060000000700000008000000 090000000a0000000b0000000c000000 0d000000feffffff1f00000010000000 11000000120000001300000014000000 15000000160000001700000018000000 190000001a0000001b0000001c000000 1d0000001e00000020000000feffffff feffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 4f00750074006c0069006e0069006e00 67005300740061007400650044006900 72000000000000000000000000000000 00000000000000000000000000000000 240002010e00000003000000ffffffff 00000000000000000000000000000000 00000000000000000000000000000000 000000007a0000000201000000000000 42006f006f006b006d00610072006b00 53007400610074006500000000000000 00000000000000000000000000000000 00000000000000000000000000000000 1c0002000100000012000000ffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000790000002800000000000000 5400610073006b004c00690073007400 530068006f0072007400630075007400 73000000000000000000000000000000 00000000000000000000000000000000 240002010d00000002000000ffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000780000000800000000000000 5600730054006f006f006c0062006f00 78005300650072007600690063006500 00000000000000000000000000000000 00000000000000000000000000000000 220002000f00000004000000ffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000770000000400000000000000 510054006f006f006c00730054007500 690070005000610063006b0061006700 65002e0044006100740061004b006500 79000000000000000000000000000000 340002000a00000015000000ffffffff 00000000000000000000000000000000 00000000000000000000000000000000 0000000073000000ff00000000000000 450078007400650072006e0061006c00 460069006c0065007300500072006f00 6a0065006300740043006f006e007400 65006e00740073000000000000000000 3a0002002400000022000000ffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000feffffff0000000000000000 44006f00630075006d0065006e007400 570069006e0064006f00770050006f00 73006900740069006f006e0073000000 00000000000000000000000000000000 300002011400000027000000ffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000660000002d03000000000000 44006f00630075006d0065006e007400 570069006e0064006f00770055007300 65007200440061007400610000000000 00000000000000000000000000000000 2e0002010c00000008000000ffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000feffffff0000000000000000 53006f006c007500740069006f006e00 43006f006e0066006900670075007200 6100740069006f006e00000000000000 00000000000000000000000000000000 2c0002012100000011000000ffffffff 00000000000000000000000000000000 00000000000000000000000000000000 000000005a000000ec02000000000000 4f0062006a004d006700720043006f00 6e00740065006e007400730056003800 00000000000000000000000000000000 00000000000000000000000000000000 220002010500000007000000ffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000590000000200000000000000 43006c00610073007300560069006500 770043006f006e00740065006e007400 73000000000000000000000000000000 00000000000000000000000000000000 24000200ffffffffffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000feffffff0000000000000000 55006e006c006f006100640065006400 500072006f006a006500630074007300 00000000000000000000000000000000 00000000000000000000000000000000 22000201ffffffffffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000feffffff0000000000000000 55006e006c006f006100640065006400 500072006f006a006500630074007300 45007800000000000000000000000000 00000000000000000000000000000000 26000201060000000b000000ffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000feffffff0000000000000000 55006e006c006f006100640065006400 500072006f006a006500630074007300 44006500760031003400000000000000 00000000000000000000000000000000 2c000201ffffffff17000000ffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000feffffff0000000000000000 480069006400640065006e0053006c00 6e0046006f006c006400650072007300 00000000000000000000000000000000 00000000000000000000000000000000 2200020118000000ffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000feffffff0000000000000000 4200610063006b00670072006f007500 6e0064004c006f006100640044006100 74006100000000000000000000000000 00000000000000000000000000000000 26000201ffffffffffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000510000004d00000000000000 53006f006c007500740069006f006e00 43006f006e00740072006f006c004f00 7000740069006f006e00730000000000 00000000000000000000000000000000 2e000201ffffffffffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000500000001400000000000000 500072006f006a006500630074007300 4c006f006100640049006e0053006f00 6c007500740069006f006e004f007000 65006e00000000000000000000000000 360002012000000009000000ffffffff 00000000000000000000000000000000 00000000000000000000000000000000 000000004f0000000400000000000000 500072006f006a006500630074005400 720075007300740049006e0066006f00 72006d006100740069006f006e000000 00000000000000000000000000000000 30000200ffffffffffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000feffffff0000000000000000 580061006d006c004c0061006e006700 75006100670065002d00450035003800 43003200410038004300000000000000 00000000000000000000000000000000 2c000200ffffffffffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000feffffff0000000000000000 44006500620075006700670065007200 57006100740063006800650073000000 00000000000000000000000000000000 00000000000000000000000000000000 20000200ffffffffffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 000000004e0000001400000000000000 44006500620075006700670065007200 42007200650061006b0070006f006900 6e007400730000000000000000000000 00000000000000000000000000000000 2800020128000000ffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 000000004c0000006200000000000000 44006500620075006700670065007200 45007800630065007000740069006f00 6e007300000000000000000000000000 00000000000000000000000000000000 26000200130000001c000000ffffffff 00000000000000000000000000000000 00000000000000000000000000000000 000000004b0000000800000000000000 44006500620075006700670065007200 45007800740065006e00640065006400 45007800630065007000740069006f00 6e007300000000000000000000000000 36000200ffffffffffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 000000004a0000000800000000000000 44006500620075006700670065007200 460069006e00640053006f0075007200 63006500000000000000000000000000 00000000000000000000000000000000 26000201ffffffff1d000000ffffffff 00000000000000000000000000000000 00000000000000000000000000000000 0000000015000000220d000000000000 44006500620075006700670065007200 460069006e006400530079006d006200 6f006c00000000000000000000000000 00000000000000000000000000000000 26000200ffffffffffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000feffffff0000000000000000 44006500620075006700670065007200 4d0065006d006f007200790057006900 6e0064006f0077007300000000000000 00000000000000000000000000000000 2c00020129000000ffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000130000005400000000000000 44006500620075006700670065007200 42007200650061006b0070006f006900 6e0074007300570069006e0064006f00 77000000000000000000000000000000 34000200ffffffffffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000120000000800000000000000 44006500620075006700670065007200 570069006e00730074006f0072006500 4100700070004d006f006e0069007400 6f007200000000000000000000000000 360002011b00000023000000ffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000110000000400000000000000 45007800700072006500730073006900 6f006e002d0045003500380043003200 41003800430000000000000000000000 00000000000000000000000000000000 28000200190000001e000000ffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000070000006b02000000000000 46004100450030003400450043003100 2d0033003000310046002d0031003100 440033005f00500072006f006a005300 74006100740065000000000000000000 3a000201ffffffff26000000ffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000060000000c00000000000000 46004100450030003400450043003100 2d0033003000310046002d0031003100 440033005f00540046004d0043006100 70007300000000000000000000000000 36000200ffffffffffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000050000000400000000000000 5300650061007200630068004d006f00 7300740052006500630065006e007400 51007500650072006900650073004c00 69007300740000000000000000000000 3800020125000000ffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000feffffff0000000000000000 570069006e0064006f0077004d006100 6e0061006700650072002e0050006900 6e006e00650064004600720061006d00 65007300000000000000000000000000 36000200ffffffffffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000040000000c00000000000000 570069006e0064006f0077004d006100 6e0061006700650072002e0056006500 720074005400610062004c0069007300 74005700690064007400680073000000 40000200ffffffffffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000030000001400000000000000 570069006e0064006f0077004d006100 6e0061006700650072002e0057006800 65006e004f00700065006e0065006400 00000000000000000000000000000000 32000201160000001f000000ffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000020000001c00000000000000 4100700070006c006900630061007400 69006f006e0049006e00730069006700 68007400730000000000000000000000 00000000000000000000000000000000 28000200ffffffffffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000010000001800000000000000 510054006f006f006c00730050006100 63006b00610067006500440061007400 61004b00650079000000000000000000 00000000000000000000000000000000 2a000200ffffffffffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000001c00000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000ffffffffffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000ffffffffffffffffffffffff 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 fefffffffefffffffefffffffeffffff fefffffffefffffffeffffff08000000 090000000a0000000b0000000c000000 0d0000000e0000000f00000010000000 fefffffffefffffffeffffff14000000 feffffff160000001700000018000000 190000001a0000001b0000001c000000 1d0000001e0000001f00000020000000 21000000220000002300000024000000 25000000260000002700000028000000 290000002a0000002b0000002c000000 2d0000002e0000002f00000030000000 31000000320000003300000034000000 35000000360000003700000038000000 390000003a0000003b0000003c000000 3d0000003e0000003f00000040000000 41000000420000004300000044000000 45000000460000004700000048000000 49000000fefffffffefffffffeffffff 4d000000fefffffffefffffffeffffff feffffff52000000feffffff54000000 55000000560000005700000058000000 fefffffffeffffff5b0000005c000000 5d0000005e0000005f00000060000000 61000000620000006300000064000000 65000000feffffff6700000068000000 690000006a0000006b0000006c000000 6d0000006e0000006f00000070000000 7100000072000000feffffff74000000 7500000076000000fefffffffeffffff fefffffffeffffff7b0000007c000000 7d0000007e000000fefffffffeffffff 64656661756c745f746d70334337372e 7465737473657474696e677300000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000200000000000100 00000001000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 1c00000001000000010000006b60905a 30cc12a84e1629420000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 14000000010000000100000000000000 00007040000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0c000000010000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 454d4654000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 32565350010000004543535000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0001000000ffffffff01000000000000 000401000000f10153797374656d2e43 6f6c6c656374696f6e732e47656e6572 69632e44696374696f6e61727960325b 5b53797374656d2e537472696e672c20 6d73636f726c69622c2056657273696f 6e3d342e302e302e302c2043756c7475 72653d6e65757472616c2c205075626c 69634b6579546f6b656e3d6237376135 63353631393334653038395d2c5b5379 7374656d2e436f6c6c656374696f6e73 2e486173687461626c652c206d73636f 726c69622c2056657273696f6e3d342e 302e302e302c2043756c747572653d6e 65757472616c2c205075626c69634b65 79546f6b656e3d623737613563353631 393334653038395d5d03000000075665 7273696f6e08436f6d70617265720848 61736853697a65000300089201537973 74656d2e436f6c6c656374696f6e732e 47656e657269632e47656e6572696345 7175616c697479436f6d706172657260 315b5b53797374656d2e537472696e67 2c206d73636f726c69622c2056657273 696f6e3d342e302e302e302c2043756c 747572653d6e65757472616c2c205075 626c69634b6579546f6b656e3d623737 613563353631393334653038395d5d08 00000000090200000000000000040200 0000920153797374656d2e436f6c6c65 6374696f6e732e47656e657269632e47 656e65726963457175616c697479436f 6d706172657260315b5b53797374656d 2e537472696e672c206d73636f726c69 622c2056657273696f6e3d342e302e30 2e302c2043756c747572653d6e657574 72616c2c205075626c69634b6579546f 6b656e3d623737613563353631393334 653038395d5d000000000b0000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 01000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000020000000000000000000000 00000000000000000200000000000000 00000000000000000000000002000000 00000000000000000000000000000000 02000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 000000000000000010000000c2000000 43003a005c00500072006f0067007200 61006d002000460069006c0065007300 2000280078003800360029005c004d00 6900630072006f0073006f0066007400 2000560069007300750061006c002000 530074007500640069006f005c003200 3000310039005c0043006f006d006d00 75006e006900740079005c0056004300 5c0054006f006f006c0073005c004d00 5300560043005c00310034002e003200 35002e00320038003600310030005c00 69006e0063006c007500640065005c00 0000ca00000043003a005c0050007200 6f006700720061006d00200046006900 6c006500730020002800780038003600 29005c004d006900630072006f007300 6f006600740020005600690073007500 61006c00200053007400750064006900 6f005c0032003000310039005c004300 6f006d006d0075006e00690074007900 5c00560043005c0054006f006f006c00 73005c004d005300560043005c003100 34002e00320035002e00320038003600 310030005c0069006e0063006c007500 640065005c006300760074005c000000 ce00000043003a005c00500072006f00 6700720061006d002000460069006c00 65007300200028007800380036002900 5c004d006900630072006f0073006f00 66007400200056006900730075006100 6c002000530074007500640069006f00 5c0032003000310039005c0043006f00 6d006d0075006e006900740079005c00 560043005c0054006f006f006c007300 5c004d005300560043005c0031003400 2e00320035002e003200380036003100 30005c0069006e0063006c0075006400 65005c006d00730063006c0072005c00 0000ca00000043003a005c0050007200 6f006700720061006d00200046006900 6c006500730020002800780038003600 29005c004d006900630072006f007300 6f006600740020005600690073007500 61006c00200053007400750064006900 6f005c0032003000310039005c004300 6f006d006d0075006e00690074007900 5c00560043005c0054006f006f006c00 73005c004d005300560043005c003100 34002e00320035002e00320038003600 310030005c0069006e0063006c007500 640065005c007300790073005c000000 c200000043003a005c00500072006f00 6700720061006d002000460069006c00 65007300200028007800380036002900 5c004d006900630072006f0073006f00 66007400200056006900730075006100 6c002000530074007500640069006f00 5c0032003000310039005c0043006f00 6d006d0075006e006900740079005c00 560043005c0054006f006f006c007300 5c004d005300560043005c0031003400 2e00320035002e003200380036003100 30005c006300720074005c0073007200 63005c000000ca00000043003a005c00 500072006f006700720061006d002000 460069006c0065007300200028007800 3800360029005c004d00690063007200 6f0073006f0066007400200056006900 7300750061006c002000530074007500 640069006f005c003200300031003900 5c0043006f006d006d0075006e006900 740079005c00560043005c0054006f00 6f006c0073005c004d00530056004300 5c00310034002e00320035002e003200 38003600310030005c00630072007400 5c007300720063005c00780036003400 5c000000ca00000043003a005c005000 72006f006700720061006d0020004600 69006c00650073002000280078003800 360029005c004d006900630072006f00 73006f00660074002000560069007300 750061006c0020005300740075006400 69006f005c0032003000310039005c00 43006f006d006d0075006e0069007400 79005c00560043005c0054006f006f00 6c0073005c004d005300560043005c00 310034002e00320035002e0032003800 3600310030005c006300720074005c00 7300720063005c00610072006d005c00 0000d000000043003a005c0050007200 6f006700720061006d00200046006900 6c006500730020002800780038003600 29005c004d006900630072006f007300 6f006600740020005600690073007500 61006c00200053007400750064006900 6f005c0032003000310039005c004300 6f006d006d0075006e00690074007900 5c00560043005c0054006f006f006c00 73005c004d005300560043005c003100 34002e00320035002e00320038003600 310030005c006300720074005c007300 720063005c0063006f006e0063007200 74005c000000cc00000043003a005c00 500072006f006700720061006d002000 460069006c0065007300200028007800 3800360029005c004d00690063007200 6f0073006f0066007400200056006900 7300750061006c002000530074007500 640069006f005c003200300031003900 5c0043006f006d006d0075006e006900 740079005c00560043005c0054006f00 6f006c0073005c004d00530056004300 5c00310034002e00320035002e003200 38003600310030005c00630072007400 5c007300720063005c00690033003800 36005c000000d400000043003a005c00 500072006f006700720061006d002000 460069006c0065007300200028007800 3800360029005c004d00690063007200 6f0073006f0066007400200056006900 7300750061006c002000530074007500 640069006f005c003200300031003900 5c0043006f006d006d0075006e006900 740079005c00560043005c0054006f00 6f006c0073005c004d00530056004300 5c00310034002e00320035002e003200 38003600310030005c00630072007400 5c007300720063005c006c0069006e00 6b006f007000740073005c000000ca00 000043003a005c00500072006f006700 720061006d002000460069006c006500 73002000280078003800360029005c00 4d006900630072006f0073006f006600 74002000560069007300750061006c00 2000530074007500640069006f005c00 32003000310039005c0043006f006d00 6d0075006e006900740079005c005600 43005c0054006f006f006c0073005c00 4d005300560043005c00310034002e00 320035002e0032003800360031003000 5c006300720074005c00730072006300 5c00730074006c005c000000d4000000 43003a005c00500072006f0067007200 61006d002000460069006c0065007300 2000280078003800360029005c004d00 6900630072006f0073006f0066007400 2000560069007300750061006c002000 530074007500640069006f005c003200 3000310039005c0043006f006d006d00 75006e006900740079005c0056004300 5c0054006f006f006c0073005c004d00 5300560043005c00310034002e003200 35002e00320038003600310030005c00 6300720074005c007300720063005c00 7600630063006f0072006c0069006200 5c000000d600000043003a005c005000 72006f006700720061006d0020004600 69006c00650073002000280078003800 360029005c004d006900630072006f00 73006f00660074002000560069007300 750061006c0020005300740075006400 69006f005c0032003000310039005c00 43006f006d006d0075006e0069007400 79005c00560043005c0054006f006f00 6c0073005c004d005300560043005c00 310034002e00320035002e0032003800 3600310030005c006300720074005c00 7300720063005c007600630072007500 6e00740069006d0065005c000000d000 000043003a005c00500072006f006700 720061006d002000460069006c006500 73002000280078003800360029005c00 4d006900630072006f0073006f006600 74002000560069007300750061006c00 2000530074007500640069006f005c00 32003000310039005c0043006f006d00 6d0075006e006900740079005c005600 43005c0054006f006f006c0073005c00 4d005300560043005c00310034002e00 320035002e0032003800360031003000 5c00610074006c006d00660063005c00 7300720063005c006d00660063005c00 0000d000000043003a005c0050007200 6f006700720061006d00200046006900 6c006500730020002800780038003600 29005c004d006900630072006f007300 6f006600740020005600690073007500 61006c00200053007400750064006900 6f005c0032003000310039005c004300 6f006d006d0075006e00690074007900 5c00560043005c0054006f006f006c00 73005c004d005300560043005c003100 34002e00320035002e00320038003600 310030005c00610074006c006d006600 63005c007300720063005c0061007400 6c005c000000d000000043003a005c00 500072006f006700720061006d002000 460069006c0065007300200028007800 3800360029005c004d00690063007200 6f0073006f0066007400200056006900 7300750061006c002000530074007500 640069006f005c003200300031003900 5c0043006f006d006d0075006e006900 740079005c00560043005c0054006f00 6f006c0073005c004d00530056004300 5c00310034002e00320035002e003200 38003600310030005c00610074006c00 6d00660063005c0069006e0063006c00 7500640065005c000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 01000100000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 04000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 010000005600000043003a005c005500 73006500720073005c00500061007300 630061006c005c0073006f0075007200 630065005c007200650070006f007300 5c004d0069006a006e0053006f006c00 7500740069006f006e005c0000000000 00000000000000000000000000000000 00000000000000000000000000000000 01000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 e0eeffff000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0f000000100000000000000001000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0200000a00cbca8dd0b390554795fcb8 f6299392a50100000000000000060000 00e174fea243b7d011ae1a00a0c90fff c3010000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 3f0000000f0000000000010000010016 4d0069006a006e00500072006f006a00 6500630074000100164d0069006a006e 00500072006f006a00650063007400b9 0000000100000001000000900163003a 005c00750073006500720073005c0070 0061007300630061006c005c0073006f 0075007200630065005c007200650070 006f0073005c006d0069006a006e0073 006f006c007500740069006f006e005c 006d0069006a006e00700072006f006a 006500630074005c006d0069006a006e 00700072006f006a006500630074002e 0063007300700072006f006a00010000 00164d0069006a006e00500072006f00 6a006500630074005500000001000000 48300030003000300030003000300030 002d0030003000300030002d00300030 00300030002d0030003000300030002d 00300030003000300030003000300030 00300030003000300000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 110000004d0075006c00740069005300 74006100720074007500700050007200 6f006a0000003d000300000000003b00 340000007b0044003000380044004300 4100430042002d003900300042003300 2d0034003700350035002d0039003500 460043002d0042003800460036003200 39003900330039003200410035007d00 2e006400770053007400610072007400 750070004f007000740000003d000300 000000003b000f000000530074006100 7200740075007000500072006f006a00 65006300740000003d00080026000000 7b004400300038004400430041004300 42002d0039003000420033002d003400 3700350035002d003900350046004300 2d004200380046003600320039003900 330039003200410035007d003b003f00 00007b00440030003800440043004100 430042002d0039003000420033002d00 34003700350035002d00390035004600 43002d00420038004600360032003900 3900330039003200410035007d002e00 440065006200750067007c0041006e00 790020004300500055002e0066004200 610074006300680042006c0064000000 3d000300000000003b00410000007b00 44003000380044004300410043004200 2d0039003000420033002d0034003700 350035002d0039003500460043002d00 42003800460036003200390039003300 39003200410035007d002e0052006500 6c0065006100730065007c0041006e00 790020004300500055002e0066004200 610074006300680042006c0064000000 3d000300000000003b00340000007b00 41003200460045003700340045003100 2d0042003700340033002d0031003100 440030002d0041004500310041002d00 30003000410030004300390030004600 46004600430033007d002e0064007700 53007400610072007400750070004f00 7000740000003d000300000000003b00 0a000000410063007400690076006500 43006600670000003d0008000d000000 440065006200750067007c0041006e00 790020004300500055003b0000000000 00000000000000000000000000000000 2d030000130000000100b401443a303a 303a7b44303844434143422d39304233 2d343735352d393546432d4238463632 393933393241357d7c4d696a6e50726f 6a6563745c4d696a6e50726f6a656374 2e637370726f6a7c633a5c7573657273 5c70617363616c5c736f757263655c72 65706f735c6d696a6e736f6c7574696f 6e5c6d696a6e70726f6a6563745c7072 6f6772616d2e63737c7c7b4136433734 3441382d304534412d344643362d3838 36412d3036343238333035343637347d 0100000101000000000000006940b401 443a303a303a7b44303844434143422d 393042332d343735352d393546432d42 38463632393933393241357d7c4d696a 6e50726f6a6563745c4d696a6e50726f 6a6563742e637370726f6a7c633a5c75 736572735c70617363616c5c736f7572 63655c7265706f735c6d696a6e736f6c 7574696f6e5c6d696a6e70726f6a6563 745c70726f6772616d2e63737c7c7b41 364337343441382d304534412d344643 362d383836412d303634323833303534 3637347d010044b401443a303a303a7b 44303844434143422d393042332d3437 35352d393546432d4238463632393933 393241357d7c4d696a6e50726f6a6563 745c4d696a6e50726f6a6563742e6373 70726f6a7c633a5c75736572735c7061 7363616c5c736f757263655c7265706f 735c6d696a6e736f6c7574696f6e5c6d 696a6e70726f6a6563745c70726f6772 616d2e63737c7c7b4136433734344138 2d304534412d344643362d383836412d 3036343238333035343637347d0a5072 6f6772616d2e637340433a5c55736572 735c50617363616c5c736f757263655c 7265706f735c4d696a6e536f6c757469 6f6e5c4d696a6e50726f6a6563745c50 726f6772616d2e637340433a5c557365 72735c50617363616c5c736f75726365 5c7265706f735c4d696a6e536f6c7574 696f6e5c4d696a6e50726f6a6563745c 50726f6772616d2e63732c3030303030 3030302d303030302d303030302d3030 30302d3030303030303030303030302e 3030303030307c000000000000000000 00000000000000180001020000000000 00000000000000000000000000000000 000c0000000300000000000000000000 00000000000000000000000000000000 0001000000ffffffff01000000000000 000c02000000784d6963726f736f6674 2e56697375616c53747564696f2e5175 616c697479546f6f6c732e546970732e 547569705061636b6167652c20566572 73696f6e3d31362e302e302e302c2043 756c747572653d6e65757472616c2c20 5075626c69634b6579546f6b656e3d62 30336635663766313164353061336105 010000003d4d6963726f736f66742e56 697375616c53747564696f2e54657374 546f6f6c732e546970732e5475697050 61636b6167652e53756f46696c654461 746101000000213c5465737453657474 696e677346696c653e6b5f5f4261636b 696e674669656c6401020000000a0b00 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 58cf0a00000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 240042006f006f006b006d0061007200 6b007300200056003000300031002e00 30003100000000000000000000000000 00000000000000000000000000000000 030000006e0043003a005c0055007300 6500720073005c005000610073006300 61006c005c0073006f00750072006300 65005c007200650070006f0073005c00 43006f006e0073006f006c0065004100 7000700054006500730074005c005000 72006f006700720061006d002e006300 7300000001000000820043003a005c00 550073006500720073005c0050006100 7300630061006c005c0073006f007500 7200630065005c007200650070006f00 73005c004d0069006a006e0053006f00 6c007500740069006f006e005c004d00 69006a006e00500072006f006a006500 630074005c00500072006f0067007200 61006d002e0063007300000002000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 02000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 feffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff 99e6084cb6d92685d0a5dee951d5f477 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000
De broncode van het programma.
  • Program zit in een namespace met de naam van het project.
  • Lijkt heel erg op een Java programma.
De configuratie van het build process:
  • Configuratie compiler: optimalisatie,
  • Verschillende configuraties: Debug en Release bijvoorbeeld.
  • De invoer van MSBuild
    > MSBuild.exe MijnProject.csproj -property:Configuration=Debug
MSBuild = dotnet build
  • Hoe ging het met InteliJ? Wat is een .iml bestand? Wat is de .idea map?
  • Hoe werkt Maven?
  • Wanneer is een solution handig? Voorbeelden.

Dit is een voorbeeld van een solution met 4 projecten

Waarom zijn er verschillende programmeertalen?

Tabel met programmeertalen

  • Geschiedenis C#: Microsoft wilde ook een soort Java
  • Microsoft’s eigen Java ‘Visual J++’ was niet compatible met Sun's Java. Microsoft verloor van Sun in de rechtzaal.
  • ‘Visual J#’ ook niets geworden.
  • .NET and C#, zelfde uitvinder als Turbo Pascal en Delphi
  • Onzin: “C# lijkt meer op C++ dan op Java”
  • een marketingstrategie om C++ programmeurs in de managed wereld te krijgen
  • de enige overeenkomsten qua syntax:
  • pointer manipulatie
  • notatie voor afgeleiden
  • operator overloading
  • geen header files, static main functie, single inheritence
  • Laat de TIOBE lijst zien van meest populaire talen
Een gedeelte van de inhoudsopgave van Horstmann
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace HaagseHogeschool { class Program { static void Main(string[] args) { string tekst = "Hallo"; Console.WriteLine(tekst); } } } package nl.haagsehogeschool; import java.util.List; import java.util.Scanner; import java.util.function.*; public class Program { public static void main(String[] args) { String tekst = "Hallo"; System.out.println(tekst); } }
  • In Java is het ook mogelijk om System.out te importeren.
  • In Python/Javascript is het heeel veel korter.
  • Gebruik het whiteboard om aan te geven wat er anders is en hetzelfde.
  • Namespaces: meerdere per bestand
  • Packages: directory structuur
  • IDE: Visual Studio voor C# vs IntelliJ voor Java
  • Andere methode namen: Console.WriteLine vs System.out.println
  • Verschillende kleurtjes (syntax highlighting)
  • Naming guidelines
  • Syntax verschillen: using vs import
  • Hetzelfde paradigma

De rode draad:

  • Heel veel hetzelfde
  • Kleine syntax-verschillen
  • En een paar grotere verschillen (asynchroon programmeren)
code conventies? camelCase methodenamen in Java, PascalCase methodenamen in C#, zie de main hier
C# is een programmeertaal die is ontworpen voor het bouwen van een breed scala aan applicaties die uitgevoerd kunnen worden op het .NET Framework. C# is eenvoudig, krachtig, type-safe en object-oriented.
  • Ook Java is type-safe
    • Dit betekent dat datatypes zoals int, double, string enz. worden gebruikt.
    • De compiler geeft al een foutmelding als je deze door elkaar heen haalt
  • Ook Java is object oriented
    • Je werkt met classes
    • Je maakt gebruik van inheritance, polymorphism en interfaces
  • Ook werken beide talen met references en garbage collection
https://en.wikipedia.org/wiki/Comparison_of_programming_languages#General_comparison
De .NET Runtime lijkt als 2 druppels water op Java Virtual Machine: Hoe code wordt gerunt met de .NET Runtime DE CLR naast JVM

I.p.v. C# kun je bijv. ook VB.NET of F# gebruiken voor het .NET platform.

Echter: C# wordt verreweg het meest gebruikt

  • Datatypes: http://www.tutorialsteacher.com/csharp/csharp-data-types
  • Unified type styem: primitieven zijn ook een object
  • Een verschil met Java! Integer bestaat niet!
  • simple types
  • value types
Parallel hieraan lopen de versies van Windows en van de .NET Standard. image/svg+xml .NET Framework ASP.NET WinForms 2002 1.0 2006 ASP.NET WinForms 3.0 WPF ASP.NET WinForms 3.5 Entity Framework WPF 2007 2016 1.0 EF Core ASP.NET Core .NET Core Mono 2004 1.0 ASP.NET ≈≈WinForms 2019 3.1 EF Core ASP.NET Core WPF Windowsdesktop WinForms alleen Windows 4.8 2019 ASP.NET WinForms Entity Framework WPF .NET 5 nov 2020 2008 3.0 ASP.NET Entity Framework ≈WinForms 2019 6.0 ASP.NET Entity Framework ≈WinForms Avalonia
  • .NET Framework uit 2002: nu versie 4.8
  • Mono uit 2004: community clone van .NET Framework. Mono kan dingen die .NET Core niet kan (LLVM, WinForms voor linux)
  • Xamarin.iOS and Xamarin.Android
  • .NET Core gaat .NET Framework vervangen

Wat is het verschil?

Het verschil in opslag tussen een Char en een String

Voor een software engineer is het belangrijk om het verschil tussen deze 2 theoretische begrippen te kennen.

In de meeste programmeertalen komt dit verschil voor

Welke types in C# herken je uit Java en wat zijn de verschillen?

  • Java: argumenten by value. alle klassen zijn reference-typen, primitieven niet.
  • C#: argumenten by value (of reference met ref). klassen zijn reference-typen, structures (bijv. primitieven) zijn value-typen.
  • C++: alles kan

Lees dit.

  • Wat gebeurt er als je twee objecten vergelijkt met de == operator?
  • Hoewel String een reference type is, zijn de vergelijkings-operatoren (== and !=) beschikbaar om de waardes (en niet de referenties!) van String-objecten met elkaar te vergelijken. Dat maakt het vergelijken van twee strings een stuk intuïtiever.
  • De String-class kent overigens ook een Equals en Compare methode
referenceequals
  • Ook C# kent exceptions
  • Het enige verschil is dat C# het verschil niet kent tussen checked en unchecked exceptions
  • De bekendste exception is: NullReferenceException
  • Wat heeft deze exception te maken met value en reference type?
  • Reminder: program code throws an Exception if a runtime error occurs
  • Reminder: wat voor soort fouten zijn er?
  • Wat doen we tegen fouten?
    • Van makkelijk naar moeilijk
    • Compile-time fouten
    • Runtime fouten
    • Logische fouten
Ja uiteraard kan dit ook met C# in Visual Studio

Bekijk de naming conventions hier.

Hoofdletters:

  • C# is ook case-sentitive
  • C# gebruikt vaker starthoofdletters dan Java
  • Voor public members gebruik je PascalCasing
  • Voor private variabelen (inclusief parameters) gebruik je camelCasing

Daarnaast:

  • Een interface begint altijd met een hoofdletter I:
  • dus IComparable of IPerson
  • Wat is encapsulatie?
  • Waarom geen publieke variabelen? public int value; vs private int value; public int getValue() { return value; } public void setValue(int value) { this.value = value; }
    • We kunnen extra logica toevoegen in de setter (is een andere methode-naam dan niet geschikter?) class Vrouw { private Man partner; public void setPartner(Man man) { this.partner = man; man.setPartner(this); // voorkom oneindige loop this.achternaam = man.achternaam; } } private int temperatuur; public void setTemperatuur(int temperatuur) { // for listeners that prevent from calling this.temperatuur = temperatuur; for (listener in this.temperatuurChangedListeners()) listener.fire(); } private Waarde waarde = null; public Waarde getWaarde() { if (this.waarde == null) this.waarde = ingewikkeldeInitialisatie(); return this.waarde; } We kunnen nu de implementatie overriden in een afgeleide klasse (maar wees voorzichtig). Er is niets mis met publieke final variabelen.

Over encapsulatie en information hiding: https://www.infoworld.com/article/2075271/encapsulation-is-not-information-hiding.html

niet alle setters hoeven publiek "{get; private set; }" objecten in OO zijn geen data houders, objecten in OO exposen gedrag

C# gebruikt geen get- en set-methodes maar properties:

private int leeftijd; public int Leeftijd { get { return leeftijd; } set { leeftijd = value; } }

Vaak is een auto-implemented property voldoende

public int Leeftijd { get; set; }

Maar als het nodig is, kan je ook logica in een property plaatsen

private double percentage; public double Percentage { get { if (percentage > 100) return 100 else return percentage; } } Wat gebeurt er als ik get {return Leeftijd; } doe (met een hoofdletter)?

C# kent

  • Class
  • Interface
  • Inheritance
  • Overloading
  • Overriding
  • Polymorphism
  • Casting
  • The Object class
  • Een constructor
Literatuur
  • Ook C# kent 1 en 2 dimensionele arrays (niets nieuws onder de zon)
  • Verder kent C# een klasse List
  • Deze werkt ook met generics (een List kan dan dezelfde objecten bevatten)
  • Vergeet niet using System.Collections.Generic; boven je code
  • List<Student> lijst = new List<Student>();
  • Waarom is het volgende ook correcte code?
  • IEnumerable<Student> lijst = new List<Student>();
  • Er bestaat in C# een ArrayList klasse. Deze werkt zonder generics waardoor casting nodig is. Dat is zelden handig.
Lees hiervoor dit.
  • Ook in C# kun je unittesten
  • Wij gaan het Xunit-framework gebruiken (er zijn anderen)
  • In Visual Studio 2019 is Xunit standaard beschikbaar als framework voor unit tests. Gebruik voor VS Code de Nuget package.
Andere unit test frameworks voor C#: TODO

Wat is een unit test?

  • unit is klein, meestal 1 methode van klasse
  • automatische test

Waarom unit testen?

  • nuttig voor het bewaken van de kwaliteit van je code
  • na iedere (kleine) wijziging kun je de code automatisch testen
  • voorkomt bugs in bestaande functionaliteit waarvoor de bestaande unittesten moeten blijven slagen
  • voor nieuwe functionaliteit moeten er nieuwe unittest bijgemaakt worden

Visual Studio

  • Maak in een nieuw Console App (.NET Core) project aan. In dit project zit de code die je wilt unittesten.
  • Voeg aan de solution met [Add] en [New Project…] een Xunit testproject (.Net Core) toe.
  • Add a reference to the Console App (waar de te testen code staat) In het Xunit project, selecteer [Dependencies] Kies met je rechter muisknop voor [Add Reference…] Kies de naam van de net aangemaakte applicatie

VS Code


                            > dotnet new console -n "MijnApp" -o "./MijnApp"
                            > dotnet new xunit -n "MijnApp.Tests" -o "./MijnApp.Tests"
                            > dotnet new sln -n "MijnAppSolution"
                            > dotnet sln add MijnApp/MijnApp.csproj
                            > dotnet sln add MijnApp.Tests/MijnApp.Tests.csproj
                            > dotnet add "MijnApp.Tests" reference "MijnApp"
                        
using System; namespace MijnApp { public class Program { public int GetGetal (int getal) { return getal; } ... } }
  • Attributen?
    • De syntax: [Depreciated] void OudeMethodeNaam() { ... }
    • Waarom zijn er attributen?
      Attributen bieden een krachtige manier om metadataof declaratieve informatiete associëren met code (samenstellingen, typen, methoden, eigenschappen, enzovoort). Het attribuut kan runtime worden opgevraagd met behulp van een techniek die reflectie wordt genoemd.
    • In Java kennen we annotaties: @Override public String toString() { ... }
    • Voorbeelden: [Serializable] public class SampleClass { [return:NotNull] [System.Runtime.InteropServices.DllImport("user32.dll")] extern static int SampleMethod([In][Out] ref double x); }

De attributen

  • [Fact] geeft aan dat een methode een unittest is
  • Als een unit-tests op elkaar lijken, dan geven we de parameters mee in een [InlineData(...)] aan een [Theory], een “geparametriseerde ” unittest.

De methoden van Assert

  • True
  • Equal
  • IsType<T>
  • IsAssignableFrom
  • Throws<T>
  • ...
  • Verwijs naar namespace van project!
  • Maak de methode een unittest met [Fact]

In :

Test -> Run All Tests

In :

> dotnet test

Verbeter het programma nu.

using Xunit; using MijnApp; namespace MijnApp.Tests { public class UnitTest1 { [Fact] public void Test1() { Program entity = new Program(); int expected = 20; int actual = entity.GetGetal(3, 1); Assert.Equal(expected, actual); } } }
Gebruik je creativiteit om een stukje code te schrijven met een (aantal) fout(en) en laat je medestudent daar testen voor schrijven. Zorg dat alleen de testen van de randgevallen falen. Groepjes van twee worden gemaakt en na 15 minuten bespreken we de moeilijkheden en de leukste tests. Twee programmeurs tegenover elkaar
[Theory] [InlineData (20)] [InlineData (40)] public void Test2 (int value) { Program entity = new Program(); Assert.True(entity.getGetal(value) == value); }
  • TDD = Test Driven Development
  • Je analyseert het probleem en kiest een oplossingsrichting
  • Op dat moment weet je nog niet hoe je dit probleem op gaat lossen
  • Maar je kent wel het gewenste gedrag van het programma:
Blackbox met invoer en uitvoer
  • Je weet wat je erin stopt en je weet wat eruit moet komen
  • Je weet alleen nog niet hoe je dat gaat realiseren (black box!)
  • De Black box is het Java-programma dat er misschien nog niet eens is
Integration tests zijn iets anders. Performance test. Load test. Penetration test.
  • Als je requirements (incl. Class Diagram) klaar zijn, weet je nog niet hoe je dat gaat programmeren, maar je weet al wel wat bij een gegeven input de verwachte output zal zijn.
  • Projectaanpak verschuift van Waterval naar Scrum (ofwel: aan het einde van elke sprint moet een kant en klaar product opgeleverd kunnen worden dat productieklaar is getest en bij elke volgende sprint verder wordt uitgebreid).
  • Tegenwoordig wordt Continuous Integration gebruikt (d.w.z. dat de installatie van software geautomatiseerd wordt uitgevoerd als alle tests succesvol zijn uitgevoerd). Testen en installeren gebeurt m.a.w. niet meer met de hand, maar door een computerprogramma.
  • Voorbeeld van een Kassa:
  • Je wilt 10% korting aan klanten geven als zij minimaal 3 producten met een minimale totaalprijs van € 100,00 kopen.
  • Stel: ik voeg een aantal producten toe:
    • Product 1 met een prijs van € 50,00
    • Product 2 met een prijs van € 60,00
    • Product 3 met een prijs van € 10,00
  • De klant betaalt (incl. 10% korting) € 108,00.
  1. Benoem verantwoordelijkheden voor elke klasse (analysemodel)
  2. Specificeer de publieke interface (met paramters en returntype)
  3. Voeg bij elk onderdeel van de interface noodzakelijk commentaar toe
  4. Voeg de properties/attributes toe
  5. Ontwerp en schrijf de tests
  6. Implementeer je interface
  • Wat zijn de globale verantwoordelijkheden van je classes?
    • Het moet mogelijk zijn om een lege kassa (zonder producten) aan te maken.
    • Er moet een item met prijs aan de kassa toegevoegd kunnen worden.
    • De totaalprijs van een bestelling (incl. korting) is opvraagbaar.
    • De kassa moet leeg gemaakt kunnen worden voor een volgende bestelling.
  • In feite heb je het hier nog over je analysemodel.
  • Hiervoor kun je de globale operaties uit je Class Diagram gebruiken (zonder parameters en returntype).
  • Specificeer de publieke interface (incl. parameters en returntypes)
  • Voeg operaties toe aan de juiste class in je Java-programma:
class CashRegister { public CashRegister() {} public void AddItem(double Price) {} public double ComputeTotal () {} public void Clear () {} }
  • To do (pas bij stap 6): programmeer AddItem (…) etc., want die geven nu natuurlijk nog niet het juiste resultaat.
Voeg aan elke operatie minimaal noodzakelijk commentaar toe. /* Voegt een product met prijs Price toe. */ public void AddItem(double Price) {} /* Berekent de prijs van een bestelling (incl. korting) */ public double computeTotal () { return 0.0 } /* CashRegister wordt geïnitialiseerd voor een * volgende klant. */ public void Clear () {}
In je ontwerp heb je al nagedacht over noodzakelijke properties. Die voeg je nu toe in je programma. /* Om de uiteindelijke prijs van een bestelling te kunnen bepalen, moet o.a. het subtotaal worden bijgehouden. */ public double Total { get; set; } /* Om de korting op een bestelling te kunnen bepalen, * moet het aantal producten worden bijgehouden */ public int Count { get; set; }
  • Bij de start moet ComputeTotal() € 0 opleveren en moet getCount() 0 als resultaat teruggeven.
  • Na toevoegen van een item (prijs: € 10) levert ComputeTotal() € 10 op en Count geeft 1 terug.
  • Na nog een item (prijs: € 20) levert ComputeTotal() € 30 op en Count geeft 2 terug.
  • Nog een item (prijs: € 20), levert ComputeTotal() € 50 op en Count geeft 3 terug (LET OP: zonder korting, want totaalprijs is nog lager dan € 100,00).
  • Opnieuw een item (prijs: € 60), levert ComputeTotal() € 99 op en Count geeft 4 terug (LET OP: nu wel met korting!!!).
  • Na Clear() moet ComputeTotal() € 0 opleveren en moet Count 0 als resultaat teruggeven.
Implementeer de methodes en voer de tests net zolang uit tot alle tests het gewenste resultaat opleveren.
Het voordeel van deze aanpak:
  • e programmeert de tests zodra je deze kunt maken.
  • Je hoeft de implementatie van de classes nog niet te kennen.
  • Je hoeft de tests maar één keer te schrijven en kunt ze telkens herhalen.
  • Kleine aanpassingen kun je op het niveau van tests snel doorvoeren.
  • Dat is niet alleen handig voor Continuous Integration, maar ook als je Refactoring (aanpassing) van je code doorvoert.
Bij elke verandering: vul je de tests aan, als de interface wordt uitgebreid of aangepast.
Doe de challenges in Stepik voor Java, nu in C#.
Doe de challenges in Stepik voor Java, nu in C#.