Learning hard C# study notes