Aujourd'hui nous allons voir comment installer le Framework .NET5 et comment utiliser dans la grandes lignes les nouvelles fonctionnalités du C#9.
Introduction
Quels sont les prérequis pour lire/comprendre ce tutoriel ?
- ★ Les bases du C#.
- ★ Les bases de la proggramation orianté objet.
Qu'allons-nous apprendre ?
- ★ Installer le Framework .NET5.
- ★ La nouvelle utilisation de new().
- ★ L'utilisation de init dans les propriétés.
- ★ L'utilisation des records.
- ★ La nouvelle utilisation des switch.
Installation du Framework .NET5
Tout d'abord je vous invite à vous rendre sur ce lien Download .NET
Une fois ici, téléchargez le kit de développement logiciel (SDK) et le runtime.
Ce sont deux installateurs banal, vous avez seulement à les executer et tout le temps cliquer sur suivant puis installer.
(Au préalable regardez si vous avez des mises à jours sur visual studio et profitez en pour les faire).
Voilà vous avez terminé la première étape, vous avez installé le Framework .NET5!
Création d'un projet .NET5
Maintenant, ouvrez visual studio.
Rendez-vous sur Créer un projet.
Créez un projet Console. ( /!\ Attention /!\ Chosir Application console et non Application console (.NET Framework))
Entrez votre nom de projet, emplacement, nom de solution.
Arrivé ici, choisissez bien le Framework cible .NET 5.0.
Voilà vous avez terminé la deuxième étape, vous avez créer votre projet sous le Framework .NET5!
La nouvelle utilisation de new()
Encienne façon
Dans un premier temps nous allons créer une class User avec les propriétés (Id, Username, Password, Role, CreatedAt) qui auront un getter et un setter.
namespace GameCreatorsArea
{
public class User
{
public int Id { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public string Role { get; set; }
public DateTime CreatedAt { get; set; }
}
}
Maintenant dans notre class Program nous allons instancier notre class User. Actuellement nous instantions comme ci dessous.
User myFirstUser = new User
{
Id = 1,
Username = "usernameExemple",
Password = "passwordExemple",
Role = "Player",
CreatedAt = DateTime.Now
};
Nous pouvons donc choisir d'instancier notre User avec User leNomDeMaVariable.
Nouvelle façon
Comparé à l'exemple précédent nous pouvons inctancier notre class User comme ceci.
User myFirstUser = new()
{
Id = 1,
Username = "usernameExemple",
Password = "passwordExemple",
Role = "Player",
CreatedAt = DateTime.Now
};
var mySecondUser = new User
{
Id = 2,
Username = "usernameExemple",
Password = "passwordExemple",
Role = "Moderator",
CreatedAt = DateTime.Now
};
Au lieu d'instancier notre class User avec new User()
nous pouvons l'instancier seulement avec le new()
.
Voilà vous avez terminé la troisième étape!
L'utilisation de init dans les propriétés
À quoi sert notre init ?
init (à remplacer par note fameux set) va changer l'accéssibilité de notre propriétée, ce qui la transformera en read only property.
init, initialization, instanciation ?
Dans un premier temps nous allons un peut changer notre propriétée Id dans notre class User public int Id { get; init; }
.
Ce qui donnera :
public class User
{
// Ici nous avons changé set par init
public int Id { get; init; }
public string Username { get; set; }
public string Password { get; set; }
public string Role { get; set; }
public DateTime CreatedAt { get; set; }
}
Qu'es-ce qui change d'une propriétée avec un setter alors ?
La propriétée avec init à la place de set, une fois la class User instanciée ne pourra pas être changée.
exemple :
Comme on le voie ma propriétée avec init ne peut pas être changée.
Voilà vous avez terminé la quatrième étape!
L'utilisation des records
C'est quoi un record ? C'est différent d'une class ?
Regardons en premier lieu la différence entre un record et une class.
Pour déclarer une class nous faisons comme cela public class User { myProperties... }
et il n'y à que de cette façon que l'on puisse déclarer une class (sauf en changeant son accessibilitée).
En revanche pour les records nous avons trois façons différentes de d'en déclarer un.
1ère : public record User(int Id, string Username);
2ème :
public record User(int Id, string Username)
{
public string Role { get; set; }
}
3ème :
public record User
{
public int Id { get; init; }
public string Username { get; init; }
}
Comme on le remarque la 1ère et 2ème façons ressemblent à un constructeur, pourquoi ?
La 3ème façon de représenter un record équivaut à la 1ère.
Les paramêtres que l'on rentre dans un record seront transformé en propriété immuable avec le fameux init que l'on parlais tout à l'heur.
C'est quoi immuable/mutable ?
immuable veut dire que vos propriétés seront uniquement en read only. mutable veut dire l'inverse, donc que vous pourrez changer les valeurs de vos propriétés à tout moment.
Et comme on le remarque dans le 2ème exemple on peut trés bien fusionner la 1ère et la 3ème sans soucis.
Quels sont les autres particularités que le record possède ?
Nous pouvons copier un record et changer ses valeurs grace au mot clé with
:
La fonction ToString()
retourne une string sur ce pattern : recordName { PropertyName = value }
.
Dans le cas de mon User celà vas retourner User { Id = 1, Username = usernameExemple, Password = passwordExemple, Role = Player, CreatedAt = 19/06/2021 20:06:06 }
.
Si vous voulez plus vous pencher vers le sujet il y à la documentation de microsoft ici.
Voilà vous avez terminé la cinquième étape!
La nouvelle utilisation de switch
En réalité le nouveau switch est apparu dans C#8, pourquoi je l'ai rajouté ?
Car je ne vois que trop peut de personnes l'utiliser, alors qu'il est super pratique et mieux que l'encien (n'est pas forcément vrai suivant les cas mais l'est en général).
Reprenons l'exemple dans la doc de microsoft :
public enum Direction
{
Up,
Down,
Right,
Left
}
public enum Orientation
{
North,
South,
East,
West
}
public static Orientation ToOrientation(Direction direction) => direction switch
{
Direction.Up => Orientation.North,
Direction.Right => Orientation.East,
Direction.Down => Orientation.South,
Direction.Left => Orientation.West,
_ => throw new ArgumentOutOfRangeException(nameof(direction), $"Not expected direction value: {direction}"),
};
Dans ce cas, on à deux enum, Orientation et Direction et une méthode d'extension qui convertis une direction en oriantation.
Déjà que veut dire le _ (alias discard)
, le switch vas s'occuper d'éssayer de convertir la direction en oriantation et s'il n'y arrive pas nous retournerons dans 3 cas avec le _
:
- une Exception
- null
- une valeur par défaut
Celà reviens avec l'encien switch de faire un case default:
.
Vous pouvez trés bien stocker la valeur d'un switch dans une variable :
Direction direction = Direction.Up;
Oriantation oriantation = direction switch
{
Direction.Up => Orientation.North,
Direction.Right => Orientation.East,
Direction.Down => Orientation.South,
Direction.Left => Orientation.West,
_ => throw new ArgumentOutOfRangeException(nameof(direction), $"Not expected direction value: {direction}")
};
Le pattern est simple Paramêtre d'entrée => return object
.
Voilà vous avez terminé la sixème étape!
Le tutoriel est terminé!
Un grand bravo si vous avez réussi à me suivre avec mon Orthographe comparable à celle d'un chameaux.
À plus tard pour un nouveau tutoriel !