Transcript for:
Notes de C#arp Formation - Introduction et Concepts Clés

bonjour à toi et bienvenue dans cette vidéo relativement longue où je vais t'apprendre les fondamentaux pour devenir un développeur c#arp si tu ne me connais pas encore je m'appelle Christophe momer je suis développeur freelance indépendant et également formateur en ligne en présentiel tu vois d'ailleurs à l'écran afficher la l'URL de ma plateforme de formation en VOD et les prochaines heures de ce cours que tu vas voir sont tirés d'un de mes cours les plus vendus sur ma plateforme je te les offre donc ici sur Youtube en exclusivité gratuitement que tu puisses découvrir ce fabuleux langage de programmation qui est le langage ccharp donc il s'agit d'un cours d'introduction à c#arpe ne t'attends pas à trouver ici des trucs et astuces très avancés c'est vraiment pour ceux qui veulent découvrir le langage et savoir comment l'utiliser ce cours a été pensé pour n'importe qui qui ne s'est même pas développé et peu importe la plate-forme je tiens à le préciser parce que l'immense majorité des courses écharpe malheureusement se trouve sous Windows avec Visual Studio qui est une machine de guerre et qui est extrêmement puissant mais pour apprendre le langage je trouve que ce n'est pas nécessaire donc si tu es sous Macou Linux la bonne nouvelle c'est que tu vas aussi pouvoir suivre ce cours parce que tu vas pouvoir travailler avec VS code et oui c'estécharpé gratuit et multiplateformes je tiens le rappeler donc c'est pour tout le monde on aura aussi l'introduction à la programmation orientée objet en c#arp en deuxème partie de cours si je puis dire où est-ce qu'on va créer de A à Z une calculatrice pour implémenter une grande partie des concepts de la programmation orientée objet de la création d'une classe jusqu'à l'héritage le statique ou les interfaces bref tu découvriras tout ça comme je l'ai dit il s'agit d'un cours complet à la carte ici on est donc sur un extrait et si le cours t'intéresse je t'invite à te rendre sur ma plateforme HTS learning.com où tu trouveras ce cours mais bien d'autres cours également autour des techno.net étant donné que ben je suis formateur et expert sur les techno.net donc tu pourras également élargir ton panel de connaissance si cela t'intéresse bref assz de blabla pour cette introduction c'est parti pour plus de 7 he de cours gratuit accessible en excluvité sur Youtube je te souhaite une bonne formation et si jamais tu décides de passer à la suite et d'acheter le cours pour aller encore plus loin dans l'apprentissage des connaissance je te dis à bientôt de l'autre côté bonne formation bonjour et bien venu sur ce cours pour devenir un développeur c#arp je me présente je m'appelle Christophe momer et je serai votre instructeur pour ce cours qui va vous amener à connaître le langage c#arp depuis les bases les rudiments les fondamentaux jusqu'à un niveau suffisant vous permettant de créer vos premières applications ce cours est publié sur ma plateforme learning dont l'adresse s'affiche ci dessous le bridetechnologiesolutions.com sans plus attendre rentrons directement dans le vif du sujet tout d'abord qu'est-ce que ccharpe alors on l'a vu c'est écrit C suivi d'un di et ça se prononce comme je le dis depuis le début carp il s'agit d'un langage de programmation c'està-dire qu'avec ce langage vous allez pouvoir programmer créer des applications mais ce langage a trois caractéristiques importantes tout d'abord il est fortement typé ce que ça veut dire c'est que chaque élément qu'on va utiliser dans le langage appartient à un type donnée et ce tout au long de sa vie par exemple si je crée une variable pour y stocker un entier je ne pourrais par la suite jamais y stocker une chî de caractère ou une date peut-être que certaines choses sont encore un peu obscures pour vous comme par exemple la notion de variable ou même entier chaîne de caractère date ça ne vous parle peut-être pas encore forcément ce sont des choses qui vont naturellement venir ici on est sur un module d'introduction je vous parle de certaines choses d'un point de vue purement théorique mais vous verrez lorsque vous pratiquez ça deviendra de suite plus CLA donc cette notion de typage fort veut simplement dire qu'une fois que vous avez créé quelque chose il ne pourra pas changer tout simplement ensuite c'est un langage de programmation dit orienté objet orienté objet c'est une approche de développement informatique où est-ce que au lieu de travailler uniquement avec des fonctions on verra plus tard également ce que c'est on va créer des objets pour y stocker diverses informations imaginez par exemple votre ordinateur comme étant un objet il stock des informations on peut par exemple retrouver comme information la taille de son écran la vitesse de votre processeur la quantité de mémoire à savoir la rame que vous avez ou la quantité d'espace 10 sur votre disque dur mais il a également des possibilités comme par exemple pouvoir l'allumer ou écrire du texte pas d'inquiétude on reviendra plus tard dans ce cours sur les principes orientés objets beaucoup plus en détail il faut juste se souvenir que le c#arp a pris cette approche pour les fondamentaux de son langage et finalement très important c'est un langage de programmation qui est multiplateforme ça n'a pas toujours été le cas pendant très longtemps c#arp était uniquement réservé au à Windows et il y a eu une version open source fait par la communauté pour Linux mais depuis certaines depuis un certain nombre d'années le langage c#arp est devenu multilateforme ce qui veut dire que quand vous connaîtrez ce langage vous pourrez créer des applications sur Windows bien entendu mais également sur Mac sur téléphone mobile des applications Web et même si vous en avez envie vous pouvez créer une application pour votre téléviseur Samsung parce que toutes ces plateformes peuvent être ciblées grâce à c#arp maintenant parlons un petit peu plus en détail du langage en tant que tel il faut savoir que le langage c#arp est un langage qui est dit compilé c'est-à-dire que le langage que vous les instructions que vous allez écrire encharpe ne sont pas les instructions qui sont comprises par la machine en effet chaque ordinateur par parle en quelque sorte selon son processeur une langue particulière et pour pour éviter d'avoir à réécrire le votre application pour supporter tous les processeurs les ingénieurs de chez Microsoft ont créé un langage qui se comporte à trois niveaux le premier celui qui nous intéresse aujourd'hui est de pouvoir écrire du c#arp c'est un langage qui se veut être universel grâce à ce langage là le compilateur va générer un autre code que le code carp vous avez écrit qui s'appelle du code il pour intermediate language c'est-à-dire qu'en fait il va transformer votre vre c#arp dans un code qui est un code commun à plusieurs langages parce qu'en fait c#arp n'est pas le seul langage qui va se retrouver transformé dans ce code là en particulier une fois que ce code a été produit par le compilateur il y a une machine virtuelle appelé le CLR qui va prendre ce langage ce code intermédiaire le code il et qui lui selon la machine et selon le le processeur sur lequel il est exécuté il va transformer ce code il en code machine sel les instructions qui sont comprises nativement par le processeur de l'ordinateur sur lequel s'exécute le programme cela peut vous sembler un petit peu compliqué mais ce que je veux dire par là et ce qui est important de retenir ici c'est que le langage ccharp n'est pas le langage final mais surtout que c'est un langage qui est compilé c'est-à-dire que contrairement à d'autres langages comme javascript par exemple le fait de compiler le langage veut dire que vous allez avoir un garde fou c'est un gros avantage parce que votre langage va être compilé ce qui veut dire à la compilation il y aura une vérification de votre code pour éviter toutes les erreurs que vous auriez pu éventuellement faire il ne faut pas voir le compilateur comme un ennemi mais bien comme votre meilleur ami parce qu'il va vous préserver d'avoir écrit du code qui ne fonctionnerait pas si le compilateur n'avait pas fait son travail et il faut savoir aussi que le compilateur c#arp est très intelligent et que de fait le code que vous avez écrit il va tenter de l'optimiser en terme de performance bien sûr ce sont des sujets qui sont très avancés c'est bien pour que vous ayez une vue du dessus de ce que fait le langage c#arp on ne descendra pas plus bas dans le cadre de ce cours sur ces notions là maintenant le langage en tant que tel est juste un ensemble d'instructions de programmation on verra par exemple les conditions les boucles la déclaration de variable et tout un ensemble d'instructions qui sont naturellement présentes dans le langage cela se traduit par le biais de mots- clés mais le langage tout seul ne va pas vous permettre d'atteindre beaucoup becoup d'objectifs juste par le BIA de ses instructions en fait le langage c#arp est fourni avec un framework le Framework.NET qu'est-ce qu'un framework et bien c'est un une collection d'outils qui est prête à l'emploi on peut voir ça un petit peu comme si pour faire un parallèle avec quelqu'un qui fait un métier le langage c'est la connaissance du métier imaginons que vous avez fait des études pour devenir menuisier donc vous connaissez les rudiments de la façon dont un menuisier travailler c'est la même chose que connaître le langage maintenant si vous devez travailler dans dans une menuiserie il va vous falloir des outils parce que le simple fait de savoir comment ser une planche ou comment clouer quelque chose ne va pas vous permettre de le faire en tant que tel si vous n'avez pas les outils adéquat qui sont le marteau et la scie et bien c'est tout à fait pareil avec le langage et le framework ici connaître le c#arp est intimement lié à connaître le framework et les outils sur lequels il se repose en fait quand je vous dis que vous allez apprendre le c#arp vous allez apprendre d'une part les instructions de base du langage mais également d'autre part les outils dans le Framework.NET et grâce à ces deux éléments vous allez pouvoir créer des applications alors il faut savoir qu'il existe une version dédiée à Windows qui s'appelle le donet framework la dernière version en date est la 4.8 et il n'y aura pas de nouvelle version d'après les dire de Microsoft actuellement et nous avons la version qui nous intéresse à savoir la version multiplateforme qui s'appelle simplement DNET il y a eu beaucoup de confusion parce que avant il y avait également la version DNET corore qui est d'ailleurs toujours existante et peut toujours être utilisée dotnetcore est donc la version multiplateforme mais Microsoft a eu pour ambition d'unifier le Framework.NET et donc de le baptiser tout simplement DNET de telle sorte que la version supérieure à la version dnetc 3.1 et la version DNET framework 4.8 donc la DNET version 5 et ultérieure soit une une seule et même version qui soit interchangeable et utilisable partout c'est donc cette version là que nous allons apprendre étant donné que DotNet framework sous Windows n'est plus qu'en Phe de maintenance et DotNet cor également maintenant que nous avons fait une brève introduction à c#arp et au Framework.NET il est temps de préparer notre environnement pour la suite du cours les outils net qu'on va utiliser dans ce cours s'installe sur tous les systèmes d'exploitation récents ainsi que vous soyez sur Windows sous MacOS ou sous Linux vous allez pouvoir suivre ce cours à contrario de certains cours qui ne présentent scharpe et.net qu'avec Visual Studio sous Windows ici j'ai pris le parti de vous montrer des outils qui fonctionnent sur toutes les plateforme pour avoir la même expérience de développeur peu importe la plateforme sur laquelle vous vous exécutez pour faire fonctionner une application DNET il nous faudra installer le runtime.net le runtime.net va être l'ensemble d'outils nécessaires qui va comprendre les éléments produits par DNET afin de les exécuter mais ce qui nous intéresse dans ce cours va être de créer des applications DNET et donc pour créer une application DNET il faudra installer le SDK software development kit pas d'inquiétude je vais vous montrer pas à pas comment préparer votre environnement mais avant de vous montrer comment installer ces différents éléments il est nécessaire de choisir un outil de développement il existe plusieurs façons de coder une application en DNET tout d'abord il faut savoir que les fichiers en c#arp sont simplement des fichiers texte ainsi il est tout à fait possible d'utiliser un simple éditeur de texte pour créer une application net cependant je ne vous recommande absolument pas cette option car un éditeur de texte ne vous donnera aucune aide au développement à contrario nous avons des environnements de développement qu'on appelle intégrés comme Visual Studio 2022 sous Windows ou encore JetBrains rider qui lui est sous Windows Mac et Linux peut-être allez-vous vous demander si rider fonctionne sur Windows Mac et Linux pourquoi ne pas avoir ch chois cet outil pour ce cours tout simplement parce que Rider est un outil qui est payant et je n'ai pas envie pour que vous appreniez le langage que vous ayez besoin de débourser le prix d'une licence pour terminer nous allons avoir Visual Studio code qui s'exécute lui aussi sous Windows Mac et Linux c'est un éditeur de code qui est largement utilisé dans l'industrie notamment par les développeurs et nous nous allons l'utiliser pour développer en c#arp c'est donc cette option que j'ai retenu pour ce cours afin que vous puissiez apprendre c#arp sur toutes les plateformes sans avoir besoin de payer une licence si à la fin de ce cours vous êtes satisfait et que vous continuez à vouloir travailler avec Csharp et.net si vous êtes sous Windows je vous recommande vivement de passer à Visual Studio 2022 voir la version de Visual Studio qui sera disponible de façon stable au moment où vous terminerez ce cours en présupposant bien entendu que vous êtes sous Windows si par contre vous êtes sous Mac ou sous Linux et que vous avez les moyens de vous acheter une licence rider je vous encourage également à acquérir cet outil qui est très puissant et très confortable à utiliser cependant je connais beaucoup de développeurs professionnels qui travaillent aujourd'hui encore avec Visual Studio code parce que il est suffisant pour des besoins basiques vous ferez votre choix en toute connaissance de cause à la fin du cours ici pour l'introduction et pour comprendre cette technologie on va rester sur quelque chose de simple Visual Studio code est donc un éditeur de code qui est gratuit et multilateformes largement suffisant pour notre apprentissage je vous invite à vous rendre à l'adresse code.visualstudio.com pour télécharger la dernière version stable correspondant à votre système d'exploitation sans plus attendre je vais me rendre dans une machine virtuelle et vous montrer la démarche pour télécharger et installer Visual Studio code me voici sur une machine virtuelle totalement vierge installée avec la dernière version de Windows en effet dans mon cas bien précis je vais faire l'intégralité du coursau Windows mais tout ce qu'on va voir ne changera pas en fonction de la plateforme je vais ouvrir le navigateur aller sur code.visualstudio.com j'arrive donc sur cette fenêtre en anglais je clique ici sur download for Windows car en effet le site a automatiquement détecté ma version de l'OS au cas où le site se serait trompé je peux cliquer sur cette flèche pour choisir en fonction de ma plateforme ici une version stable ou une version insiders alors soyez vigilant avec la version nommée insiders car en fait celle-ci est une version preview voire beta qui contient les dernières fonctionnalités en date dont vous n'avez peut-être pas besoin et qui peut également être source d'instabilité vous pouvez donc cliquer sur la petite flèche bleue dans la colonne stable correspondant à votre système d'exploitation si jamais le site s'est trompé sinon un simple clic sur le bouton suffit moi ici sous Windows cela me télécharge un fichier exécutable que je peux donc lancer il s'agira simplement de l'installeur de Visual Studio j'ai donc à suivre l'assistant pour installer Visual Studio code une fois l'installation terminée je peux voir ici que j'ai la case exécuté Visual Studio code qui est cochée en cliquant sur Terminer cela m'ouvre donc l'éditeur de développement je vais donc en profiter pour l'épingler à ma barre des tâches afin d'y avoir un accès rapide le mettre en plein écran je vais un peu zoomer que vous puissiez mieux voir et à partir de là j'ai un assistant me permettant de configurer mon expérience avec Visual Studio code en fait nous avons ici une liste d'étapes qui permet de choisir notamment comment vous voulez que l'éditeur se comporte si vous souhaitez vous connecter pour synchroniser paramètres par exemple ici sur cette deuxième option je peux aller choisir un autre thme par exemple le thme clair si je préfère j'ai également la possibilité de définir et de comprendre comment fonctionne l'éditeur et si je clique ici en bas sur marque don je peux voir que j'arrive donc sur la page d'accueil welcome qui me propose de commencer en ouvrant un fichier ou un dossier il faut savoir que Visual Studio code de base ne comprend aucun langage de développement en particulier et qu'il est nécessaire d'installer installer des extensions afin de le faire fonctionner avec le langage de votre choix ici nous allons donc configurer Visual Studio code pour qu'il fonctionne avec C c#arp afin de vous expliquer comment cela fonctionne je vous donne rendez-vous dans la prochaine vidéo dans la vidéo précédente nous avons découvert l'outil Visual Studio code qui va nous servir d'éditeur de code pour apprendre le langage c#arp et le Framework.NET cependant comme je l'avais dit Visual Studio code nu c'est-à-dire installé et lancé sans aucun paramétrage ne comprend pas et ne sait pas travailler en c#arp tout l'intérêt de Visual Studio code est qu'il est extrêmement extensible c'est-à-dire qu'on va installer des extensions pour rajouter des outils et des fonctionnalités à l'éditeur afin de gérer différents langages ou différents outils dans notre cas depuis donet8 Microsoft a créé une MTA extension qui s'appelle le c#arp dev kit qui contient l'intégralité des outils dont nous avons besoin pour travailler avec c#arp au sein de Visual Studio code à noter que l'utilisation de toutes les fonctionnalités de cette extension va nécessiter la création d'un compte Microsoft qui est gratuit et également que vous vous authentifiez dans Visual Studio code afin de déverrouiller l'intégralité des possibilités de l'outil si vous avez déjà un compte Microsoft c'est très bien sinon vous pouvez en créer un gratuitement sans aucun problème sans plus attendre je vous donne rendez-vous dans la machine virtuelle sur Visual Studio code pour vous montrer l'installation et la mise en place de l'extension comme nous l'avons vu dans les slides Visual Studio code n'est pas capable de comprendre s chararpes si nous n'installons pas l'extension qui lui permet de comprendre le langage tout d'abord petite astuce par rapport à ce que je vous ai montré dans la vidéo précédente à la suite de l'installation vous avez ici ce qu'on appelle la page de bienvenue cette page n'est en aucun cas obligatoire mais elle s'affichera systématiquement si vous ouvrez Visual Studio code sans préciser de fichier ou de dossier vous pouvez décocher la case à cocher ici show welcome page on startup afin de dire que vous ne souhaitez pas avoir cette page de bienvenue qui vous offre d'une part des raccourcis rapides pour ouvrir un fichier ou un dossier et d'autre part ici ce qu'on appelle des assistants de découverte vous permettant entre d'apprendre les fondamentaux de l'IDE de booster votre productivité ou plus et comme on va le voir quand on va installer l'extension de ccharpe on aura un nouvel assistant alors comment installe-t-on l'extension de ccharpe c'est très simple on se rend ici sur extension ce bouton sur la gauche et nous allons avoir ici une liste des extensions disponibles pour Visual Studio code comme vous pouvez le voir il y en a une très grande liste et vous pouvez librement en installer autant que vous le souhaitez par exemple dans les T premiers de la liste on retrouve notamment python mais vous allez pouvoir trouver aussi C ou C++ et bien d'autres langages nous nous allons chercher ici c#arp à partir de là on va avoir le tout premier qui est le c#arp devkit je clique donc dessus et si on prête attention à ce qu'il y a dans le résumé de cette extension on peut voir en fait que c'est une méta extension parce que le DEF kit installe le c#arp extension intelcode for c#arp et le DotNet runtime install tool alors quels sont ces trois extensions qui composent cette méta extension c'est plutôt simple c#arp extension qui est donc lissé d'ailleurs ici aussi sur la gauche c'est pour que Visual Studio code puisse comprendre le c#arp et donc vous offrir la coloration syntaxique et l'autocomplession intellicode for c#arp est un assistant qui a été amélioré par intelligence artificielle notamment par le machine learning afin de faire en sorte que les propositions faites par l'outil par Visual Studio soit pertinente d'un point de vue analyse Ia on retrouve d'ailleurs ici dans la liste de gauche et finalement le DNET runtime install Tool est l'outil intégré dans cette extension qui va vous permettre d'installer le runtime et le SDK comme on en parlait justement dans la vidéo précédente permettant d'exécuter et de développer des applications en c#arp donc en cliquant ici sur le bouton install je vais installer en fait ces trois extensions avec un seul clic je clique donc sur Install et d'ailleurs on peut voir ici dans le menu de gauche que carp et intelcode sont passés en statut installing d'ailleurs si vous souhaitez installer rapidement une extension vous pouvez directement cliquer sur le bouton bleu depuis menu une fois l'extension installée l'interface graphique est quelque peu modifiée parce que nous n'avons plus le bouton pour installer mais le bouton pour désinstaller ici on peut également désactiver une extension si on ne s'en sert plus mais qu'on ne souhaite pas la désinstaller et pour terminer nous avons ici le switch to prérelease version qui vous permet de passer sur une version preview à savoir une version plus récente qui à l'instar de la version insiders de Visual Studio code offrira les dernières fonctionnalités en date mais mais pourrait également introduire des bugs et des comportements inattendus vous pouvez très bien cliquer dessus par exemple et comme vous pouvez le voir je suis passé en version 1.1.12 avec un petit tag qui est prérelease version et ici j'ai le bouton qui est switch to release version pour revenir à la version stable officielle on voit aussi quand on installe certaines extensions ce bouton ici reload required qui va simplement dire qu'il faut redémarrer rafraîchir Visual Studio code pour que l'ex extension soit correctement installée je reviens donc en version stable 1.0.14 et je ferme tout ce qui est lié aux extensions à partir de là Visual Studio a maintenant l'extension cécharpe installé cependant je n'ai pas encore tout configuré parce que je n'ai pas installé ni de runtime ni de SDK si je fais contrôle mage + P je vais retrouver la liste des commandes que Visual Studio connaît et ici on peut voir dès le début qu'on a beaucoup de commandes qui commencent par DNET build clean new project bref on va voir tout ça un peu plus tard ne vous inquiétez pas et ce qu'on va taper c'est welcome en fait on va vouloir ouvrir l'Assistant ici welcome Open wallthr qui va nous offrir l'assistant et on va choisir get started with SARP death kit en cliquant là-dessus on va donc avoir l'assistant de carp qui va se lancer et vous pouvez pouz le voir ici en arrière-plan qu'on a des éléments qui vont s'installer notamment le runtime au moment du tournage de cette vidéo malheureusement le runtime qui est installé par l'outil est la version 7.0.14 alors que DotNet 8 est sorti et est disponible en version stable vous pouvez aussi éventuellement avoir cette erreur qui dit que le sdk.netcore n'a pas pu être localisé sur votre machine et que donc DNET n'est pas un programme exécutable reconnu ce sont des erreurs malheureusement dans cette version du def kit qui sont pénibles on peut tenter de les résoudre en passant le DEF kit en pré-release comme ceci comme je vous avais montré juste précédemment on clique sur reload et donc avec la version en pré-release on peut relancer l'assistant donc contrô MHP open Worlds through avec le get started et donc ici potentiellement certaines erreurs peuvent être résolus si ce n'est pas le cas on a un bouton ici dans cette fenêtre qui nous affiche get the SDK en cliquant dessus Visual Studio code nous dit attention vous allez ouvrir un site internet je clique sur Open et donc j'arrive sur le site officiel pour télécharger le SDK de.NET c'est malheureusement quelque peu fastidieux mais si vous avez une erreur à l'installation peut-être que suivre ces quelques étapes pourraient vous aider en descendant un petit peu on retrouve ici le sdk.net 8 qui est donc au moment du tournage de cette vidéo la dernière version stable en si vous avez à votre disposition DNET 9 ou plus n'hésitez pas à l'installer sur réserve que cette dernière soit stable je vais donc cliqueer ici sur download.net SDK x64 parce que ma machine est une machine Windows en 64 bits si vous avez une machine en 32 bits ce qui est très peu probable vous allez vouloir installer la version x86 si par contre vous êtes sur Mac OS avec une puce M1 M2 M3 ou plus ou sous une machine arm c'est le SDK pour arm 64 4 qu'il faudra télécharger je clique donc sur Télécharger le SDK une fois que le SDK est téléchargé je clique pour ouvrir le fichier et je suis les étapes de l'installeur afin d'installer le SDK sur ma machine normalement le DNET runtime install Tool est censé faire cela pour moi mais comme on l'a vu juste avant parfois le déroul est quelque peu faillible d'où je vous montre les étapes manuellement une fois que ceci est fait on peut voir que l'installation a bien réussi que j'ai donc donet 8 avec le runtime avec ASPNET et Windows desktop parce que je suis sous windows je peux donc faire fermer fermer le navigateur et ici au sein de Visual Studio code je ne vais pas avoir de grosses différences je peux redémarrer Visual Studio code voire même redémarrer ma machine pour être sûr mais pour m'assurer que l'installation est ok je vais cliquer ici pour afficher un terminal et dans le terminal ainsi ouvert je vais taper dnet--list-sd DKS et cette commande devrait normalement m'afficher les SDK mais il est possible comme on peut le voir ici que le terme donet n'est pas reconnu par votre machine dans ce cas-là je vais fermer Visual Studio code je vais faire un clic droit ici pour démarrer un nouveau terminal et essayer cette commande dans un terminal donet-- list SDK et là cela fonctionne bien tout simplement parce que Visual Studio code n'a pas rafraîchi les variables d'environnement comme on peut le voir le SDK est installé dans C programfiles.net SDK si vous avez encore des erreur avec un terminal qui n'est pas de Visual Studio code je vous invite à redémarrer votre machine pour terminer si malgré tout après le redémarrage vous avez toujours des erreurs n'hésitez pas à aller voir dans les paramètres du système d'exploitation au niveau des paramètres avancés de votre ordinateur dans les variables d'environnement au niveau de la variable passe qui est donc définie ici par utilisateur ou ici pour tout le système d'exploitation vous faites modifier et vous vous assurer d'avoir ces programmfiles.net dans les variables d'environnement tout du moins dans la variable d'environnement pass de votre système et non pas de l'utilisateur si cette ligne n'existe pas n'hésitez pas à la créer et de même n'hésitez pas non plus à la déplacer le plus haut possible dans la liste vous pouvez le voir ici dans ma configuration actuelle qu'elle est juste en dessous du premier enregistrement avec pourc systemme rote donc en le mettant le plus haut dans la liste elle aura la plus haute priorité je vous invite donc à le faire manuellement si besoin on peut le voir ici dans mon cas ce n'est pas nécessaire je vais donc pouvoir relancer Visual Studio code et à partir de là on peut le voir ici j'ai l'explorateur qui s'est chargé avec les éléments qui sont donc chargés pour la partie DNET et je peux donc cliquer sur le bouton create.net Project qui va me permettre de créer mon tout premier projet net mais je ne vais pas faire ça dans cette vidéo je vous donne rendez-vous dans la prochaine pour qu'on crée ensemble notre tout premier programme c#arp pour créer un projet c#arp afin de commencer à apprendre le langage ce n'est pas très compliqué en fait on peut le voir ici directement à l'écran je peux créer directement le projet depuis Visual studio code en cliquant sur le bouton create.net project c'est une solution une autre solution est de me rendre dans mon explorateur de fichier créer un répertoire par exemple mon premier projet et dans ce répertoire faire un clic droit ouvrir le terminal à noter que ceci est valide aussi pour toutes les plateformes et donc dans le terminal ouvert taper la commande DNET new en fait dnetne est la commande DNET qui va permettre de créer une nouvelle application on peut voir ici que les modèles les plus courants sont les suivants et donc nous avons une colonne non cours qui permet de déterminer l'application qu'on veut créer dans le cadre de ce cours tout du moins au début nous allons créer des applications console c'est-à-dire qui vont s'exécuter comme ceci dans une console sans aucune distraction afin de nous focaliser sur le langage donc pour créer une application console on va faire DNET new console alors attention en tapant simplement cette commande le projet qui va être créé aura le nom du répertoire dans lequel il sera créé donc ici je vais avoir un projet qui va s'appeler mon premier projet si vous ne souhaitez pas avoir le nom du répertoire dans lequel vous exécutez la commande ou que vous souhaitez que le projet soit créé dans un répertoire avec un autre nom utiliseer T N et donnez-lui un nom par exemple mon projet en exécutant cette commande je demande à DNET de me créer une application console qui s'appelle mon projet qui est stocké dans le répertoire mon premier projet mais qui va être dans son dossier autonome exécutons la commande pour voir ce qui se passe et comme on peut le voir en arrière-plan j'ai bien un dossier mon projet qui a été créé qui contient divers éléments notamment un répertoire obj un fichier CS pro et un fichier CS qui sont donc les fichiers liés à c#arp on peut le voir ici dans le type on a un fichier source c#arp project et un fichier source c#arp donc ça c'est une alternative je vais supprimer ce que je viens de créer on peut donc passer par la ligne de commande si d'ailleurs vous avez des questions pour savoir quelles sont les options possibles comme par exemple T N n'hésitez pas à utiliser la commande t- help à la fin qui va vous afficher toutes les options que vous pouvez rajouter après votre instruction pour donner plus d'information à ce qui doit être créé les plus attentifs remarqueront ici qu'il n'y a pas de T N tout simplement parce que ces options ne sont pas spécifiques à un modèle donc au modèle console mais sont des options qui sont générales d'où le Tet n Le Tet e et ainsi de suite n'hésitez pas à faire quelques recherches et quelques expérimentations pour manipuler la ligne de commande ça peut sembler un petit peu à l'ancienne mais ça reste quelque chose de très puissant à l'inverse je peux très bien travailler ici avec Visual Studio code remarquez que pour créer un projet.net le mieux est de se placer dans un répertoire données je vais donc cliquer sur le bouton open folder et si vous n'avez pas cette fenêtre là faites simplement file open folder ici je vais aller sélectionner le répertoire que j'ai créé en avance de phase et je fais sélectionner un dossier là Visual Studio le code m'affiche une alerte attention vous ouvrez un fichier ou un dossier est-ce que vous faites confiance à ce qu'il y a dedans par rapport aux auteurs qui auraient créé éventuellement ce dossier et ces fichiers vous pouvez mettre oui ce qui va donc permettre de faire l'exploration du dossier et de tous les fichiers avec toutes les fonctionnalités de l'éditeur ou vous pouvez mettre non qui va vous permettre quand même de naviguer dans le dossier mais en mode restrictif donc sans avoir toutes les possib dans le cas présent c'est nous-même qui avons créé ce répertoire donc on va cliquer sur Oui mais avant de cliquer sur Oui je vais cocher cette case pour dire que je fais confiance non seulement à ce dossier mais également tout ce qui se trouve dans le dossier par an qui s'appelle document qui est donc mon dossier personnel en cliquant sur ce bouton bleu j'ai donc Visual Studio code qui s'ouvre avec toutes les fonctionnalités mais vous pourvez remarquer ici que je n'ai plus le bouton cre.net project casselan tienne en faisant cont ô mage ETP je vais retrouver la commande DNET new project si elle n'est pas directement visible ici dans la liste pour vous n'hésitez pas à écrire.net pour faire un filtre rapide et pouvoir trouver new project si malgré tout en tapant DNET la commande n'apparaît pas c'est très probablement que l'extension aurait mal été installée je vous invite dans ce cas-là à la désinstaller voir la réinstaller voire aussi passer en version de prérelease et relancer votre environnement relancer votre Visual Studio code pour avoir cette commande en cliquant dessus Visual Studio va donc changer et m'afficher la liste de tous les types de projets que je peux créer et donc ici on se retrouve avec une grande liste mais nous ce qui nous intéresse ça va êt être console app encore une fois pour vraiment se focaliser sur le langage et ne pas être parasité par des spécificités liées à spnet blazor WPF ou n'importe quelle autre technologie je clique donc sur console Visual Studio code me demande comment appeler ce projet je vais donc l'appeler ici mon premier projet je fais entrer Visual Studio me pose la question est-ce que vous souhaitez créer un nouveau dossier donc on peut voir ici que j'aurais un sous-dossier mon premier projet dans mon premier projet où est-ce que je veux choisir un autre répertoire je vais choisir un autre répertoire pour le mettre directement dans mes documents à la racine et donc créer les éléments dans le dossier que j'avais créé précédemment si je voulais que Visual Studio me crée aut atiquement les éléments j'aurais pu ouvrir Visual Studio code au niveau du répertoire document plutôt qu'au niveau du répertoire mon premier projet que j'avais créé en amont pour vous montrer comment faire la commande donet new à partir de là l'interface change quelque peu parce que en effet ici sur la partie gauche mon premier projet correspondant au répertoire que j'ai ouvert je retrouve la liste de tous les fichiers qu'il y a dedans alors si vous êtes attentif vous avez probablement remarqué que on a plus d'éléments en passant par Visual Studio que en passant par la ligne de commande on a notamment le point vs code bin et le point SLN qui sont des fichiers qui n'existaient pas quand on a utilisé donet new mais ce n'est pas très grave pour l'instant par contre remarquer également que ici tout en bas nous avons solution explorer alors on peut faire un peu de nettoyage éventuellement parce qu'on a également outline et timeline ici qui sont des éléments qui font partie du template de base mais il est tout à fait possible de désactiver ces blocs faites un clic droit dessus décocher outline et décocher timeline pour n'avoir que la vision par dossier qui est obligatoire et le solution explorer si on ouvre le solution explorer on retrouve une hiérarchie qui est beaucoup plus simple que celle du dossier en effet ici nous allons avoir la solution le point SLN quand on laisse le curseur sur cet élément on peut voir qu'il pointe vers le SLN un projet solution a pour unque but de regrouper un ensemble de projets entre eux ainsi une fois que le SLN a été créé je peux faire un clic droit dessus et choisir new project qui va me rouvrir l'assistant ici permettant de créer un nouveau projet sauf que ce projet sera rattaché à ce fichier de solution ce qui peut s'avérer très pratique dans des applications complexes qui font appel à différentes technologies ensuite nous avons ici en dessous le projet qui est rattaché à cette solution onut voir que c'est le fichier CS pro donc au final quand on prête attention aux différents fichiers qui ont été générés nous avons tout d'abord le point SLN qui est la solution globale de mon application qui contient le lien vers le CS pr qui est donc le projet c#arp de mon application et si je déplie le projet on peut voir dedans qu'on a programme.cs qui est donc le fichier de code c#arp dans lequel on va être amené à travailler tout au long de ce cours il n'est n pas mention ici dans le solution explorer ni de Bin ni de obge qui sont des dossiers de travail du compilateur de c#arp obj étant un dossier temporaire bin étant le répertoire de sortie des binaires quant à point vs code il s'agit tout simplement d'un répertoire qui va stocker les paramètres de votre Visual Studio code à partir de là quand vous arrivez à ce résultat vous êtes prêt à travailler avec c#arp et dès le prochain module on va étudier ensemble les premières instructions et comment écrire du code c#arp vous allez probablement voir tout au long de ce cours des vidéos où je fais appel à une extension qui s'appelle omnisharp omnisharp est en effet l'ancêtre du c#arp devkit et plusieurs fois je crée des projets à un même niveau je vous invite à être beaucoup plus rigoureux dans l'approche avec la nouvelle extension et de vous créer un dossier par projet pour l'étude des différents cas afin d'éviter de quelconque problème si d'aventure vous auriez quelques problèmes avec l'extension de Visual Studio faites contrôle maage +p et ici choisissez DNET restart language Server qui va redémarrer l'extension.net notamment pour l'analyse du langage si besoin dernière chose vous allez pouvoir lancer une application c#arp en ouvrant ici un terminal en vous assurant d'être dans un répertoire qui contient du code c#arp notamment un répertoire qui contient le fichier CS pro donc ici je suis dans C user c#arp document mon premier projet donc le répertoire qui contient ce fichier CS pro d'ailleurs si je tape ls je peux voir qu'il est bien ici à partir de là je peux taper DNET run comme commande ce qui aura pour effet d'exécuter l'application après l'avoir compilé ça prend un peu de temps la première fois mais on peut voir ici s'afficher sur la console Hello World qui est exactement ce que cette instruction veut dire où est-ce qu'on veut afficher hello world pas d'inquiétude si vous ne comprenez pas exactement cette instruction on va la décortiquer ensemble on apprendra à en écrire d'autres beaucoup d'autres tout au long de ce cours vous pouvez donc lancer votre projet c#arp comme ceci tout au long du cours vous allez me voir Utiliser le terminal pour taper les commandes DNET build qui va donc provoquer la compilation et DNET run qui va provoquer les exécution je trouve ça plus pratique à utiliser mais il y a une vidéo attachée en bonus dans la section bonus de ce cours tout à la fin qui vous explique comment exécuter un programme c#arp depuis Visual Studio code et également faire usage de ce qu'on appelle le dbuger afin d'inspecter ce qu'il se passe quand votre application s'exécute ce qui peut être utile pour comprendre parfois certains comportement pour clôturer cette vidéo remarquez ici que j'ai un petit bonhomme avec un macaron 1 qui me dit dit qu'il faudrait que je me connecte pour utiliser le c#arp dev kit bien que dans l'immédiat ce ne soit pas obligatoire je vous invite vivement à le faire pour débloquer toutes les fonctionnalités cliquez simplement dessus cela va vous renvoyer vers Microsoft il vous suffira de vous connecter avec un compte Microsoft pas de panique si vous n'en avez pas c'est totalement gratuit vous allez cliquer sur crées en un ici vous allez donc créer votre compte Microsoft gratuitement donc c'est une adresse email @live.fr le plus souvent et à partir de là vous allez pouvoir vous connecter dans l'extension pour l'utiliser à son plein potentiel je vous invite donc à le faire avant d'aller plus loin maintenant notre environnement est prêt si il vous manque quelque chose que vous n'êtes pas arrivé au même résultat que moi n'hésitez pas à revoir les vidéos pour essayer de voir où est-ce que cela n'a pas fonctionné si malgré tout vous êtes toujours bloqué je vous invite vivement à utiliser le chat la session de question réponse venir sur discord bref vous rentre sur la partie communautaire pour essayer d'avoir quelqu'un de la communauté qui puisse vous aider afin de pouvoir continuer ce cours sereinement maintenant asse de blabla notre environnement est prêt il est temps de décortiquer cette instruction s'écharpe afin que vous puissiez commencer à écrire les vôtres rendez-vous dans le prochain module j'ai repris ici l'instruction c#arp qui était proposée de base à savoir la deuxième donc celle qui n'est pas en vert on verra la première ligne en verre un peu plus tard ceci est une instruction c#arp et ce qu'on va faire c'est qu'on va la décomposer élément par élément afin que ce soit plus clair pour tout le monde et que tout le monde comprenne comment s'écrit une instruction ccharp la première chose c'est qu'on voit ici en bleu clair au début le le mot console avec un C majuscule ce mot console c'est l'objet qu'on va vouloir utiliser alors c'est une utilisation un petit peu particulière on reviendra dessus bien en détail mais en gros je vais dire ici l'objet que je veux utiliser une fois que j'ai défini que je voulais utiliser cet objet- là à savoir la console je vais mettre un point ce point s'appelle un accesseur c'est-à-dire que si je tape console point ce qui va arriver après le point appartient à l'objet console et là ce que je fais c'est qu'on va utiliser une méthode c'est-à-dire c'est pour ça qu'elle écrit en jaune clair cette méthode là c'est que sur l'objet console je vais aller chercher une méthode que je vais vouloir exécuter je vais dire à l'objet console fais cette action exécute cette chose donc ici cette méthode s'appelle WR line pour écrire une ligne et une méthode comment la reconnaît et bien tout simplement parce qu'elle a des parenthèses ces parenthèses sont utilisées pour passer des paramètres à la méthode la console le la méthode r line pardon a besoin d'un paramètres pour savoir qu'est-ce qu'elle doit écrire comme ligne quel est le contenu de la ligne qu'elle doit écrire et pour qu'on puisse lui dire voilà le contenu que je veux que tu écrives il faut que je lui donne l'information cette information se passe entre parenthèses si une méthode n'attend pas de paramètres on mettra parenthèse ouvrante parenthèse fermand rien au milieu on aura l'occasion de revenir là-dessus bien en détail pas d'inquiétude on est bien ici dans une vision au niveau de l'instruction donc ici j'ai décidé d'appeler sur l'objet console la méthode right line en lui passant entre parenthèses la valeur qui est hello world donc en fait ça c cette cette valeur là c'est ce que je veux dire à la à la console écris-moi ça sur la console sous forme d'une ligne donc on reviendra sur les paramètres et sur les types plus tard bien sûr mais en gros je lui dis écris-moi hello world on remarquera qu'il y a des guillemets de part et d'autre ce qui est en fait de fait une chaîne de caractère pour finir essentiel et très important il y a systématiquement un point virgule à la fin d'une instruction ccharpe tant que le compilateur ne rencontre pas le Point Virgule il continuera à enchaîner les différentes les différentes instructions ce qui veut dire que si je ne mets pas de pointvgule ce qui va venir juste après devra correspondre à ce qu'il y avait avant et ça me permet également d'écrire l'instruction sur plusieurs sans avoir besoin d'utiliser un caractère particulier donc ici on a une vue globale de ce qui est une instruction ccharpe alors la première en l'occurrence qui est de sur croix un petit peu particulière comme on le verra au fil de cet exerci de de ce cours mais ce qu'il faut retenir ce qui est essentiel à retenir de ce slide c'est que chaque instruction cécharpe se termine par un pointvgule que pour accéder aux informations d'un objet on utilise le point que une méthode s'appelle avec les parenthèses et qu'on donne les paramètres de cette méthode entre parenthèses tout ça sera bien sûr revu et quand vous pratiquerez ce sera beaucoup plus simple la deuxième instruction un peu plus spéciale est ce qu'on appelle un commentaire comment est-ce qu'on le reconnaît déjà parce qu'il a une couleur verte mais aussi parce qu'il commence par un double slash on le voit ici à l'écran ce commentaire nous permet de mettre du texte libre dans du code comme par exemple pour donner une indication pour expliquer quelque chose ou rajouter une information ici si on prend le commentaire qui est présent de base il nous explique qu'est-ce qui s'est passé pourquoi est-ce qu'on a ce nouveau template parce que auparavant avant DNET 6 les applications console étaient beaucoup plus fourni que ça il y avait beaucoup plus d'instructions maintenant c'est ultra simplifié et on commence par cette ultra simplification pour apprendre votre apprentissage comme ça on se focalise sur l'essentiel donc Microsoft a rajouter ce commentaire en début de fichier avec un lien pour ceux qui sont curieux en disant rendez-vous sur ce lien là pour comprendre qu'est-ce qui s'est passé et pourquoi il n'y a qu'une seule instruction dans ce fichier vous pouvez à n'importe quel moment de votre écriture entre deux instructions carp écrire autant de commentaires que vous voulez tant qu'il y a double slash au début et que vous en écrivez un par ligne cela vous permet de rajouter des informations à côté du code qui peut même vous être utile à vous-même maintenant qu'on a vu ces deux instructions carp on va faire un petit exercice vous allez écrire vous-même votre première instruction ccharpe à la ligne de la première c'està-dire sur la ligne numéro 3 et en se basant sur ce qui était écrit sur la deuxième ligne qui affiche sur la console hello world l'exercice vous demande d'écrire une ligne de code qui lorsqu'on va exécuter notre programme c#arp affiche sur la console j'apprends le c#arp je vous laisse mettre la vidéo en pause faire l'exercice et je vous donne rendez-vous dans quelques secondes le temps que vous fassiez l'exercice pour qu'on voit ensemble la correction je vous propose d'aller voir ça directement dans l'éditeur de code de Visual Studio sur la machine de démo il est maintenant temps de passer à la pratique et d'écrire notre toute première instruction en c#arp afin de réaliser cet exercice j'ai créé un dossier sur mon disque dur ici s Windows je l'ai créé dans un dossier course sarpe module 1 comme vous pouvez le voir à l'écran le dossier est vide on va donc créer notre projet c#arp comme on l'a fait en introduction on peut le faire de multiples façons par exemple en maintenant la touche mage ou shift je peux faire un clic droit et choisir ouvrir dans le terminal si vous êtes sous Linux ou sous MacOS vous avez d'autres façons d'ouvrir un terminal et de la même façon on pourrait aussi le faire par Visual Studio code et donc ici dans le terminal je vais taper la commande DNET new console-n et je vais lui donner un nom qui va être première instruction alors en donnant un nom avec le paramètre t n je vais spécifiquement nommer ce nouveau projet première instruction ce qui aura pour effet de le stocker dans un dossier dédié ce qui est exactement ce que je veux parce que je veux isoler chacun de mes projets entre eux pour éviter tout conflit en appuyant sur Entrée on peut voir que lesoutils.net me créent bien mon projet et j'ai donc ici première instruction ce que je vais faire c'est que je vais me placer dans le dossier ici je vais faire un clic droit ouvrir dans le terminal et je vais taper la commande code espace point cette commande me dit d'ouvrir Visual Studio code dans ce dossier en particulier et elle fonctionne sur toutes les plateformes il est possible d'ailleurs que sous Windows vous ayez l'élément de menu en faisant un clic droit ouvrir dans Visual Studio code directement dans ce menu ici ou dans afficher d'autres options moi ici j'ai ouvrir avec Visual Studio parce que sur cette machine j'ai Visual Studio 2022 d'installer mais la solution qui fonctionne sur toutes les plateformes c'est d'utiliser l'instruction code espace point point faisant référence au dossier courant en faisant ceci on peut voir que Visual Studio code s'ouvre directement sur mon projet qui a ainsi été créé je vais donc pouvoir fermer la page de bienvenue et mettre en petit ici première instruction parce que cet élément de menu dans l'explorateur fait référence à l'exploration sous forme de dossier on voit qu'on a ici le fichier CS pr on a le fichier SLN on a les dossiers bin et obj et le programme.cs en mettant celui-ci en petit et en ouvrant le solution explorer je vais avoir une expérience proche du développement c#arp avec des IDE plus complets et donc ici en dépliant mon projet première instruction je retrouve ou le programme.cs et je retrouve donc ici le code c#arp et j'ai donc ici directement sur le projet certains éléments facilités comme la possibilité de rajouter un nouveau fichier un nouveau dossier ou même de compiler la solution avec build ici qui si je le lance va me faire la commande DNET build à ma place plutôt que de passer par le terminal maintenant il est temps d'écrire notre première instruction comme on l'a vu dans les slides nous avons ici directement une instruction c#arp fourni par l'outil qui a généré automatiquement qui affiche donc Hello World sur la console si je clique sur cette icône que je clique sur run and debug et que je clique sur c#arp et qu'ensuite je valide que je veux lancer mon projet première instruction je peux voir ici s'afficher dans la console en bleu hello world c'est exactement le résultat qui est attendu vu que l'instruction ici me dit d'écrire une ligne sur la console qui contient hello world pas d'inquiétude pour le détail de chacune des instructions et des éléments on va y venir par la suite nous ce qu'on va faire c'est qu'on va écrire sur la console en dessous de Hello World j'apprends le c#arp en fait il s'agira de recopier cette instruction donc on va commencer par mettre un commentaire pour dire ce qu'on va faire donc le commentaire je le rappelle commence par un double slash on peut le voir c'est colori en vert ce qui veut dire que ce ne sera pas évalué par le runtime c#arp il s'agit simplement de texte à des fins d'informations pour nous ou d'autres développeurs donc ici j'écris sur la console par exemple un commentaire qui en soit ici n'est pas du tout utile je vous invite d'ailleurs à utiliser les commentaires avec parsimonie et à ne commenter que les instruction qui pourrait porter à confusion pour les autres développeurs ou apporter des précisions sur des éléments de code où est-ce que vous trouvez que c'est nécessaire et ne pas commenter chaque ligne donc ici je le fais juste à défin pédagogique mais bien entendu on va le supprimer par la suite donc on va taper console on peut voir que au fur à mesure qu'on tape les caractères de console on a un menu déroulant ici qui s'affiche qui nous propose tout ce qui commence par conso et même pour être plus précis tout ce qui contient les lettres C o ns parce qu'on peut voir ici que on a console et après on a CO avec le O et le S ici pour cet élément en particulier qui est configure à weit options ensuite on a ici par exemple task completion source alors ne vous inquiétez pas du tout de tous ces élémentsl on va en couvrir une grande partie dans ce cours bien entendu ce ne sera pas exhaustif mais cette aide à la complession vous êes à trouver l'élément qui vous intéresse si en l'occurrence ici on peut voir que j'ai console qui est surligné en bleu je peux indistinctement cliquer dessus ou faire entrer pour valider le choix du menu déroulant ce qui va autocompléter ma saisie une fois que c'est fait on va donc utiliser le point et là comme vous le voyez j'ai j'ai de nouveau une liste déroulante qui s'affiche mais cette fois-ci son contexte va se limiter à l'élément console ce qui veut dire que je vais avoir ici non pas l'intégralité de ce que je peux écrire en cécharpe mais bien ce qui est lié à l'objet console et vous verrez quand vous créz vos propres objets que ce genre d'aide à la complétion çaavare très utile remarquez également que les deux premières lignes ne sont pas en ordre alphabétique si on regarde à partir de background color on peut voir que tout est par ordre alphabétique mais right Line et read Line qui commence respectivement par W et R sont en début de la liste et ne respecte donc pas l'ordre affalbétique pourquoi cela on remarque également la présence d'une petite étoile au début entre l'icône et le nom de la méthode dans le cas présent tout simplement pour dire que c'est probablement une de ces méthodesl qu'on veut utiliser et ça c'est une suggestion par le biaet de ce qu'on appelle intell code qui est un assistant de code par par intelligence artificielle en fait cette petite intelligence artificielle va analyser la structure de votre fichier et vous proposer la méthode qui lui semble la plus pertinente dans le contexte actuel bien entendu ce n'est en rien une obligation c'est simplement une suggestion pour aller beaucoup plus vite remarquez ici je n'ai tapé aucun caractère si je fais simplement entrer j'ai directement right Line qui va s'écrire ce qui va donc me faire gagner un temps précieux et donc ici je vais ouvrir les parenthèses remarquez aussi que Visual Studio code ajoute automatiquement la parenthèse fermante je vais ouvrir les guillemets à l'instar des parenthèses il ajoute automatiquement le guet ferm et donc je vais écrire j'apprends le c#arp et je vais me rendre à la fin de la ligne pour écrire le pointvgule afin de valider mon instruction j'ai donc écrit ma toute première instruction c#arp je n'ai plus qu'à sauvegarder le fichier soyez vigilant avec cela Visual Studio code contrairement à d'autres éit éditeur ne sauvegarde pas automatiquement le fichier on peut le voir à l'aide de deux indicateurs visuels tout d'abord nous avons un petit 1 dans une bulle bleue ici au niveau de l'explorer qui nous montre bien que un fichier n'a pas été sauvegardé quand on laisse le curseur de la souris sur l'icône on peut voir à la fin de l'infobule one unsaved file ce qui veut dire un fichier non sauvegardé aussi pour savoir lequel fichier est concerné donc lequel n'a pas été sauvegardé on a ici une bulle blanche qui prend la place de la croix de fermeture comme on peut le voir quand on met la souris dessus qui indique que ce fichier n'est pas sauvegardé je peux donc faire file save ou aller plus vite et faire contrôl s en tant que raccourci et en faisant ceci non seulement la bulle blanche disparaît ici mais également le macaron bleu ici ce qui veut dire que le fichier est sauvegardé et donc si je décide de réexécuter l'application je peux voir que ma ligne j'apprends le c#arp et est donc affiché sur la console j'espère que vous avez réussi ce tout premier exercice et que vous avez donc écrit votre tout première instruction ccharpe et si c'est le cas félicitations vous avez fait le premier pas d'une longue aventure où vous allez apprendre ce langage puissant avec moi si vous n'arrivez pas à exécuter votre application parce qu'il est possible des fois que Visual Studio code soit un petit peu capricieux avec l'outil run and debug n'hésitez pas à aller ouvrir un terminal avec new terminal et ici si taper la commande DNET run ce qui aura exactement le même effet que Bill and debug sauf que c'est un peu plus concis vu qu'ici nous n'avons que le résultat de notre exécution alors que dans ce qu'on appelle la debug console on a tout un ensemble de messages qui nous permet de savoir qu'est-ce qui se passe à l'exécution de notre application et vous pourrez également placer ce qu'on appelle des points d'arrêt afin d'inspecter l'état actuel de votre code à l'exécution je n'en parle pas dans cette vidéo vous allez trouver à la fin du cours dans une section vidéo bonus une vidéo qui vous explique comment débugger votre programme c#arp notamment pour y placer des points d'arrêt et espionner le contenu des variables notre première instruction étant écrite il est temps d'apprendre d'autres fondamentaux notamment le concept de variable dans cette vidéo nous allons nous attaquer à un concept très important qui est une variable qu'est-ce qu'une variable une variable est une donnée que l'on souhaite stocker pour travailler mais ce qui est important c'est que le contenu d'une variable peut changer je parle bien du contenu et non de son type en c#arp je le rappelle qui est un langage fortement typé une variable sera fortement typée c'est-à-dire que son type est défini à sa déclaration et ne pourra pas changer donc si je crée une variable par exemple pour stocker l'âge d'une personne je vais stocker l'âge sous la forme d'un entier parce que je vais stocker le nombre d'années et bien dans cette variable que j'aurais appelé par exemple ge je ne pourrais stocker à l'avenir que des entiers et plus rien du tout je pourrais pas stocker son prénom ou sa date de naissance car ce ne sont pas des entiers alors comment est-ce qu'on déclare une variable en ccharpe la syntaxe est la suivante on écrira le type de la variable suivi d'un espace suivi du nom qu'on ve donner à la variable suivi d'un espace avec ég et la valeur en terminant le tout par un point virgule comme à chaque instruction s'écharpe ici on voit qu'une variable se compose de tro éléments le type que l' choisit une fois pour toute son nom de telle sorte qu'on puisse la l'exploiter et la réutiliser et une valeur initiale à noter que cette valeur initiale n'est pas obligatoire mais pour le moment on va se contenter de fonctionner uniquement comme ça j'ai listé ici quelquesuns des types les plus courants que vous allez utiliser et des plus simples qu'on va utiliser dans ces quelques vidéos qui vont venir le premier est celui dont on on a parlé juste avant qui est un entier la déclaration se fait avec le mot clé int in il s'agit du type donc si je veux déclarer une variable de type entier qui contient l'age par exemple je vais écrire int espace âge âge étant le nom de la variable égal la valeur de l'âge par exemple 25 j'aurais stocké dans la variable âge la valeur 25 donc la valeur l qui est ici à droite s'écrit directement en chiffre il n'y a pas de guillemets ni d'autres caractères j'écris simplement 25 2 et 5 pointu autre type très courant la chaîne de caractère on a déjà travailler avec une chaîne de caractère non pas pour la stocker dans une variable mais pour directement la donner à une fonction la chaîne de caractère est de type String STR donc par exemple si je veux stocker le prénom j'écrirai string espace prénom est égal et étant donné qu'on est sur une chaîne de caractère la valeur doit être écrit entre guillumet donc j'écrirai égal ouvrez les guillemets Christophe fermer les guillemets pointvule et ce faisant j'ai créé une chaîne de caractère je pourrais donc stocker dedans que des chaînes de caractères le dernier type assez courant avec lequel on va travailler est ce qu'on appelle un boulé1 donc ici le type c'est boule B ool l donc si je veux par par exemple cré un boul 1 je vais écrire B ool l espace par exemple est vivant est égal et pour la valeur un Boulen ne peut avoir que deux valeurs c'est le type le plus basique en informatique ça représente un simple bit donc 0 ou 1 au niveau du processeur donc ça peut seulement valoir vrai la valeur vraie s'écrit trou TR r u e ou FALSE faux false F a l s e donc j'écrirai par exemple boule espace est vivant égal trou pointvgule une petite chose à noter le nom d'une variable ne peut pas contenir d'espace un espace dans le nom de la variable correspondrait à une fin de déclaration de nom et provoquerait une erreur de compilation généralement en c#arp lorsqu'on veut utiliser un nom qui est composé comme par exemple ce que j'ai dit avant est vivant dans le cas d'une variable on fera commencer le le nom de la variable par une minuscule donc est en minuscule et le mot qui vient juste après on met sa première lettre en majuscule ainsi F vivant s'écrira est en minuscule V majuscule i V a NT en minuscule voilà les exemples que j'ai donné nous allons avoir le int est égal à 33 pointvule le string prénom est égal à Christophe entre guillemets pointvule et le bouléen est vivant est égal à trou et donc voici la notation avec le V majuscule sur cette capture d'écran il ne faut pas prêter attention au soulignage en jaune ici il s'agit simplement d'un avertissement du compilateur comme quoi cette variable a été déclarée mais n'a jamais été utilisé il existe une autre syntaxe appelée le typage implicite où c'est le compilateur qui va tenter de deviner le le type de la variable en fonction de la valeur pour se faire au lieu de mettre le type de la variable espace le nom égal la valeur on utilisera un mot-clé qui s'appelle Var nous n'aurons ainsi pas besoin d'écrire le type on écrira simplement Var le nom de ma variable est égale à la valeur j'ai dit précédemment que la valeur n'était pas obligatoire à savoir si j'ai déclaré une variable par exemple int âge je n'ai pas l'obligation de mettre in âge égal quelque chose pour utiliser le mot CF Var par contre je suis obligé d'affecter une valeur parce que c'est en observant cette valeur-là que le compilateur va pouvoir déduire le type de la variable ce n'est donc pas possible d'écrire une instruction qui serait simplement Var le nom d'une variable pointvgule parce que le compilateur ne saurait pas de quel type est cette variable et cela est illicite en c#arp voici quelques exemples de comment déclarer une variable avec le motcé Var encore une fois le même le même attention s'applique le soulignage n'a pas de n'a pas d'impact ici j'ai déclaré trois variables avec les mêmes types que ceux vu précédemment à savoir entier chîn de caractère et bouléen sauf que je n'ai pas utilisé au début le type mais bien à chaque fois le mot clévar j'ai rappelé le nom et quand j'ai fait le égal c'est là que à partir de la valeur qui est ici le compilateur c#arp a pu déterminer que cette variable taille était un entier cela peut créer un peu la confusion parce qu'on pourrait croire que Var est simplement pour stocker une variable quel que soit son type il faut juste savoir que c'est une facilité d'écriture parce que quand le compilateur va passer il va déduire le type par rapport à la valeur et c'est bien int taille é= 182 qui sera stocké dans le code il et non pas Var ainsi Var qui s'écrit en trois lettres n'apporte pas de plusvalue par rapport à int qui s'écrit lui aussi en trois lettres par contre quand on verra plus tard des types plus complexes ou si je prends même l'exemple qu'on a déjà vu qui s'appelle string qui contient pour sa part 6 caractères on divise par de le nombre de caractères à taper il s'agit d'une appréciation purement personnelle choisir le motclévard ou le typage fort est plus de l'ordre d'une appréciation d'écriture et de lecture je ne peux que vous inviter au début de votre apprentissage d'utiliser systématiquement le type au lieu de Var je vous ai parlé des deux façons de faire maintenant je vous invite à utiliser le type afin de vous familiariser avec ces derniers une fois qu'une variable a été déclarée on peut comme je l'ai dit auprè précédemment la réaffecter changer sa valeur la syntaxe est assez simple on reprend le nom de la variable et on fait égale la nouvelle valeur ça impose bien sûr que la variable est été déclarée au préalable si vous tentez de faire une variable qui s'appellerait taille sans l'avoir déclaré et que vous vous faisiez taille est égale à 200 il y aura une erreur parce que le compilateur va vous dire affectation d'une variable qui n'a pas été déclarée par contre si la variable taille a été déclarée comme c'était le cas dans la slide précédent on peut changer sa valeur en réaffectant sa valeur ainsi le contenu de la variable taille ne vaudra plus 182 mais bien 200 on peut donc changer la valeur d'une variable après sa création c'est là tout l'intérieur des variables dans la vidéo précédente nous avons exploré le concept de variable qui permettait de stock doné qui évolue au fil du temps dans cette vidéo nous allons voir la notion de constante et on s'en doute une constante comme son nom l'indique est quelque chose de Constant c'estàdire que c'est une donnée qu'on va vouloir stocker pour travailler mais dont le contenu ne changera jamais c'estàdireune fois qu' est déclaré on peut plus faire on peut plus modifier son contenu exactement pareil que pour les variables une constante est fortement typée c'est-à-dire que comme une variable son type est défini à la déclaration et ne pourra pas changer mais à l'inverse d'une variable la valeur également déclarée ne pourra pas changer ainsi pour déclarer une constante la syntaxe est la suivante on reprendra exactement le la même syntaxe que pour une variable à savoir type espace non espace égale valeur mais on rajoutera au début de cette instruction le motcé conste CST alors attention ce motcé est réservé au langage c#arp et ne peut pas être utilisé comme un nom de variable ou un nom de constante c'est-à-dire que je ne peux pas avoir const string con ég valeur étant donné que le motcé est réservé une fois que ça c'est fait j'ai donc déclaré une constante qui ne changera pas Voici quelquesuns des exemples ici j'ai repris trois lignes int valeur est égale à 42 qui est une constante string pay qui est égale à France qui est aussi une constante et boule vrai qui est égale à trou qui est également une constante cela veut dire que je ne peux pas à la suite de ce code écrire valeur égale 81 ou pays égale Belgique cela sera illicite étant donné qu'elles ont été déclaré comme constante il faut savoir que lorsqu'une variable est déclarée comme constante le compilateur l'inclus dans le code il directement en tant que valeur fixe ce qui veut dire que partout constant sera utilisé la valeur fixe sera posée de telle sorte que ça ne pourra jamais muter à l'instar de ce qu'on a vu précédemment le soulignage ici des noms de constantes est juste un avertissement comme quoi est déclaré mais jamais utilisé donc il n'y a pas lieu d' d'en tenir compte nous avons vu qu'une variable pouvait être affectée c'est-à-dire que on peut changer sa valeur au fur et à mesure de l'exécution du code jusqu'à présent nous avons fait une affectation avec une valeur fixe ma variable on avait pris l'exemple taille est égale à 200 néanmoins ce n'est pas les cas les plus courants bien que cela arrive généralement on se sert de variaable pour récupérer une valeur qui est renvoyée par une fonction nous avons vu une fonction au début de ce cours de ce module quand nous avons utilisé la fonction console.r Line qui affichait une ligne sur la console cette fonction prenez un paramètre et nous avons rien fait d'autre avec cette fonction mais il faut savoir que certaines fonctions permet de récupérer une valeur par exemple là si je souhaite lire depuis la console je vais appeler une fonction qui s'appelle console.reline cette fonction un petit peu particulière va permettre à l'utilisateur de saisir ce qu'il a envie de saisir dans la console et dès lors qu'il aura appuyé sur rentrée la le la fonction sera terminée et on passera à l'instruction suivante de notre code c#arp mais ça veut dire que la valeur saisie par l'utilisateur doit bien êre récupéré et bien il s'agit d'une valeur de retour d'une fonction on y reviendra plus en détail quand on étudiera les fonctions mais en l'occurrence si je veux récupérer la valeur renvoyée par readline je dois la stocker dans une variable donc je vais créer une variable qui est définie comme étant l'appel de la fonction ainsi pour récupérer la saisie d' l'utilisateur je vais écrire par exemple Var saisi est égal à console readline en laissant le curseur sur la fonction readline dans Visual Studio code nous voyons l'indication de la valeur de retour et de ce fait nous pouvons également déduire le type auutiliser Var il est maintenant temps de passer un petit exercice et quand nous allons corriger je vous montrerai tout ce que je viens de dire cet exercice est très simple nous allons demander le nom de l'utilisateur et simplement afficher sur la console bonjour suivi de prénom donc le nom prénom de l'utilisateur il devra le saisir les instructions pour réaliser cet exercice sont les suivantes on peut créer une nouvelle application console dédiée qui ne serait pas le bac àable dans lequel on s'amuse à prendre des notes et dans lequel on s'amuse à essayer diverses instructions qui est mon premier projet donc vous pouvez très bien créer une nouvelle application DNET new console-n exercice 1 c'est ce que je vais faire dans les dans la corriger ensuite on va utiliser la méthode console.reline pour afficher une valeur on peut par exemple dire l'utilisateur veuillez saisir votre nom et appuyez sur entrere la valeur entre parenthèses de right line peut être également une variable ou une constante ou directement la valeur comme c'est le cas dans ce que nous avons fait comme exercice précédemment finalement on va utiliser la méthode console.readline pour lire cette valeur et nous allons de ce fait devoir afficher cette valeur directement dans la console étant donné que aujourd'hui on ne sait pour le moment pas encore comment faire bonjour et le prénom seront affichés sur deux lignes différentes par souci de simplicité je vous invite à mettre la vidéo en pause et je vous donne rendez-vous dans quelques secondes pour la correction maintenant que nous savons ce qu'est une variable et ce qui est une constante faisons un exercice visant à récupérer le prénom de l'utilisateur le stocker dans une variable et après l'afficher directement sur la console pour ce faire j'ai déjà ouvert en avance de phase un terminal dans le dossier module 1 je vais donc créer un projet dédié dnetne console et je vais le nommer infoerso en fait on va faire évoluer ce projet avec de nouveaux concepts au fur et à mesure des prochaines vidéos je vais donc me rendre dans ce dossier info perso qui a ainsi été crée qui contient donc mon projet et je vais taper la commande code espace point pour ouvrir Visual Studio code dans ce projet ici à l'instar de ce qu'on a déjà vu je me rends directement dans le programme.cs de mon solution explorer je vais donc pouvoir supprimer ce qui a été ajouté automatiquement par les outils ccharp maintenant ici ce qu'on va vouloir faire c'est demander à l'utilisateur de saisir son prénom et récupérer la valeur la première chose à faire dans ce cas c'est d'indiquer à l'utilisateur ce qu'on attend de lui on va donc utiliser console.r line alors petite astuce on peut utiliser comme on l'a vu dans la vidéo précédente et comme on le voit à l'écran à l'instant les premiers caractères et appuyer sur entré on peut aussi taper CW et on remarquera que CW a une icône un peu particulière c'est en fait ce qu'on appelle un snipet donc un boot de code automatisé et quand je clique dessus on peut voir que ça rajoute automatiquement system.cole.r l en fait c'est exactement la même chose que faire cw.entrée afin d'avoir directement system.cole.reline qui est écrit c'est un petit peu dommage qu'aujourd'hui nous avons système point devant qui va un peu complexifier inutilement l'écriture mais ça peut être un raccourci qui pourrait être utile si jamais vous souhaitez aller plus vite pour rester simple je vais toujours utiliser console point right line en utilisant les menus d'autocomplé au fur et à mesure de ce cours donc ici je vais écrire ce que j'attends de l'utilisateur qu'il puisse avoir une instruction à respecter comme ceci c'est-à-dire que la phrase veuillez saisir votre prénom va s'afficher sur la console maintenant je dois récupérer le prénom de la personne directement dans une variable quel est le type de variable qui va me permettre de récupérer le prénom de la personne il s'agira d'une chaîne de caractères et donc du type String donc string me permet de déclarer le type de variable donc ici je dois lui donner après un nom je vais donc l'appeler ici par exemple prénom cette variable je peux l'affecter directement au retour de la valeur consolereadline comme ceci console.reline va me retourner la saisie de l'utilisateur dès lors qu'il aura appuyé sur la touche entrée dans la console on remarquera quelque chose d'un petit peu étrange console.reline est souligné en jaune un petit peu comme une erreur dans Word si je laisse le curseur dessus je peux voir que j'ai ici ce qu'on appelle un warning donc en fait le compilateur attire mon attention sur un point potentiellement problématique qui me dit que je tente en anglais en l'occurrence de convertir une valeur nulle vers quelque chose de non nulable bien entendu à ce stade du cours cela ne veut absolument rien dire pour vous donc on va laisser ça de côté pour l'instant on va y revenir plus tard dans cours pour comprendre ce dont il est question pour le moment on va juste garder en tête qu'il y a ici un potentiel problème et on verra plus tard comment le résoudre une fois que j'ai récupéré la variable prénom si qui veut dire qu'en fait j'ai récupéré dans la variable prénom ce que la personne ais dans la console je vais pouvoir afficher sur la console bonjour et ensuite je vais afficher directement son prénom remarquez ici d'ailleurs que Visual Studio code me propose le prénom avec une petite étoile et je peux juste faire entrer et cela fonctionne ici le fait d'avoir stocké prénom dans une chaîne de caractère nous permet de l'utiliser directement comme ceci dans console.r line de la même façon que n'importe quel autre chaîne de caractère si je sauvegarde cette application que je décide de l'exécuter donc ici je refais les mêmes manipulations que précédemment on peut voir veuillez saisir votre prénom j'ai donc ici une zone de saisie si je tape dans la zone de saisie mon prénom qui est donc ici on peut voir qu'on a une petite flèche pour dire que c'est ce que moi j'ai saisi on a donc ici bonjour Christophe donc le résultat cela fonctionne bien entendu exactement pareil si je décide de lancer un nouveau terminal avec D net run on a donc veuillez saisir votre prénom et si je le tape ici et que je fais rentrer on a donc bonjour Christophe la seule différence c'est que ici on a en gris ce que nous avons saisi et en bleu ce qui a été écrit par le programme et dans le terminal classique il n'y a pas de distinction ce qui peut rendre les choses peut-être un peu plus complexe au final ça n'a pas été très compliqué de récupérer les informations dans une variable il suffit simplement de déclarer son type de lui donner un nom et éventuellement de lui affecter une valeur à noter ici qu'on aurait pu faire ça éventuellement en deux temps par exemple déclarer la variable comme ceci et mettre la variable est égale à console Prim line en deux lignes ça fonctionne de la même façon mais par souci de code assez condensé et plutôt propre c'est mieux de l'affecter directement à la déclaration comme on peut le voir directement à l'écran si vous avez réussi cet exercice félicitations vous savez maintenant comment utiliser une variable pour stocker de l'information et utiliser cette variable pour différents usages notamment ici pour l'afficher sur la console s'il reste des zones d'ombre dans ce qui a été fait dans cet exercice ou dans ce qui a été vu juste avant je vous invite vivement à revoir cette vidéo à reprendre le temps de refaire l'exercice et réassimiler ces concepts parce que ceci est essentiel avant d'aller plus loin dans le cours cette vidéo est un petit peu particulière parce que nous allons rentrer dans les types en détail ce que j'entends par là c'est que jusqu'à présent nous avons travaillé avec des types comme int string et Bou on les a vu mais on n'est pas allé de dans le détail donc il faut prendre cette vidéo non pas comme une comme une suite logique de la vidéo précédente mais bien comme un entract qui permet d'approfondir le sujet des types en fait cette vidéo sert un petit peu de référence et je vous invite à prendre des notes ou des captures d'écran de ce qui va être affiché pour pouvoir y revenir plus tard si nécessaire avec les informations que je vais vous délivrer je ne m'attends pas à ce que vous compreniez la totalité de ce que je vais dire directement ici mais ça vaut quand même le coup de dire ça maintenant pour que vous puissiez comprendre qu'effectivement ce n'est pas anodin le typage on a vu que le langage se réserve des mots-clés pour les types mais en fait ce qu'il faut savoir c'est qu'il s'agit simplement d'alias c'est-à-dire d'un raccourci par exemple nous avons vu int int mais de façon sous-jacente le type derrière ce mot-cé a été défini au sein du Framework.NET en tant qu'un objet pouvant héberger des informations sur un entier et en fait le int correspond à un entier qui est codé sur 32 bits si vous n'êtes pas familier avec ce genre de chose encore pour l'instant pas d'inquiétude encore une fois c'est une vidéo de référence si ça vous semble trop complexe n'hésitez pas à avancer dans le temps ou même à la passer à la vidéo suivante en fait il faut savoir qu'il y a beaucoup de types différents qui existent directement dans le Framework.NET je vais prendre l'exemple de la représentation d'un chiffre d'une variable numérique selon C critères comme la taille du numérique qu'on veut stocker si c'est un très gros chiffre ou un très petit chiffre le fait que ce chiffre puisse être négatif ou non ou si il peut avoir une partie décimale va influencer le type qu'on va choisir jusqu'à présent par exemple on a simplement choisi int qui correspond à un entier un entier pouvant d'ailleurs être positif ou négatif mais ne pouvant pas avoir de partie décimale donc pour se faire comme je l'ai dit étant donné qu'il s'agit d'une vidéo de référence je vais vous part ager un tableau qui reprend tous les types numériques voici la table de référence des types numériques qui existent dans le Framework.NET et en c#arp dans la première colonne on retrouve le type en c#arp donc l'alias c'est ici par exemple qu'on peut voir sur cette ligne qu'on a int le fameux int qui servait de type dans la colonne juste à côté on va retrouver les types système à savoir les types tels qui sont codés dans le framework net et on voit encore une fois sur la ligne du int que int correspond en vérité à une un objet qui s'appelle int 32 qui est stocké dans system donc si j'écris system. in 32 comme c'est écrit là espace é= 32 j'aurais exactement le même comportement et la même façon d'être que le int qui est qu'un raccourci d'écriture en c#arp donc toute la colonne de gauche sont les raccourcis de ce qui est réellement le type explicité dans la colonne de droite pour dans certains cas le compilateur ne pourra pas faire le distingo si vous utilisez Var notamment entre une valeur et une autre et de ce fait il va avoir besoin d'un suffixe c'est-à-dire qu'on va écrire la valeur et après on va rajouter le suffixe on voit ici que certains types comme par exemple long ou u int ou u long ou même dans les dans les types réel déci décimal double et float ont besoin d'un suffixe par exemple si je veux écrire un entier et le stocker dans un long je vais devoir le suffixer avec un L 32 l ça peut sembler bizarre mais c'est une instruction que le compilateur sa utilisé pour faire ce qu'il faut à des fins de référence j'ai rajouté également la taille que prend en mémoire une variable de ce typelà on voit par exemple qu'un Antier int est codé sur 32 bits c'est-à-dire qu'il va réserver 32 bits de mémoire sur votre espace RAM dans l'exécution et finalement en dernier j'ai mis la plage des valeurs possibles alors à noter ici que c deux exposants 7 même si le 7 est en bas et non pas 2 avec un 7 qui est en dessous c'est bien exposant 7 on voit par exemple sur la ligne du long que la valeur peut aller de - 2 exp 63 à + 2 exp 63 - 1 ce qui est quand même énorme on a une petite subtilité on voit bien que ces groupes sont séparés en trois groupes les anti signés les antiers non signés et les réels qu'en est-il un anti une variable antiignée indique que la valeur peut-être positive ou négative sans vouloir faire un cours sur la façon dont est codé un entier en mémoire le langage va se réserver un bit de la mémoire à affecté pour définir si oui ou non il est négatif on appelle ça la signature et grâce à la valeur de ce bit là il saura si l' est positif ou négatif ensuite on a les an qui sont non signé ce qui veut dire que le BIT qu'on utilisait pour la signature devient un bit de valeur et c'est d'ailleurs pour ça qu'on peut constater si je prends le cas de du int qui allait de - 2 exp 31 à + 2 exp 31 - 1 va cette fois-ci de 0 à 2 expos 30 2 - 1 ce qui est loin d'être anod 1 d'avoir un bit de plus pour coder une valeur supplémentaire et donc les enti nom signés ne peuvent pas être négatifs 0 étant la valeur minimale c'est-à-dire que toutes les bits de la ça veut dire c'està-dire que tous les bits de la valeur sont égales à Z0 alors que si on était igné le premier indiquerait la valeur de la signature finalement nous avons les types réels qui à l'instar de ce qui se fait en Mathé tique sont les types avec des virgules donc on le voit il y a 11 types pour représenter les numériques en ccharp et ce n'est pas exclu qu'il y ait d'autres types qui arrivent dans le futur ici ce qu'il faut retenir c'est que vous allez le plus souvent utiliser int double et décimal qui sont les types les plus courants les autres sont donnés à des fins indicatives si vous êtes dans une optique d'optimisation des performances en mémoire par rapport à un projet donné vous pouvez vous servir de cette table de référence afin de choisir le type qui correspond le mieux à ce que vous voulez stocker si par exemple vous voulez stocker l'âge d'une personne la valeur stockée sous forme de byte est largement suffisante parce qu'elle va de 0 à 255 si par contre vous voulez effectivement stocker les millimètres carrés d'une propriété peut-être qu'il vous faudra un U long ou un U int à l'insta à à l'inverse si vous souhaitez par exemple stocker des températures peut-être qu'un short sera suffisant en bref il faudra adapter le type par rapport à la donnée que vous voulez stocker si vous souhaitez optimiser la mémoire si ce n'est pas une préoccupation pour vous dans l'état actuel des choses je vous recommande de vous contener à in float double et décimal maintenant portons notre attention sur les types à virgulle on voit ici que le le double a une très grande possibilité de stockage et le flot et le décimal pas pas autant alors pourquoi je vais vous apporter quelques détails supplémentaires les types flot et double sont des types à virgule flottante appelé à virgule flottante pour des calculs haute précision c'est-à-dire que on va aller jusqu'à un millionième en terme de précision donc ces valeurs là flot et double sont recommandé pour des calculs mathématiques vous avez besoin de valeurs scientifiques précises très précis justement parce que ça va vous permettre d'aller faire des calculs avec une très haute précision par contre si vous utilisez ce qui est le plus courant dans les logicieles de gestion un nombre à virgule pour stocker des éléments financier dans ce cas le décimal est bien plus approprié parce que les la haute précision ne risque pas de créer des erreurs d'arrondi sur des additions c'est un sujet un petit peu avancé mais il faut savoir que la valeur 1 par exemple en flot ou en double peut être égale à 1,3201 donc 1,00 32 fois suivi d'un 1 ce qui n'est pas vraiment 1 et qui si on l'arrondit avec une logique par exemple d'arrondir au 50 centimes près et qu'on arrondit au supérieur et ben 1 est égal à 1,50 € ce qui peut être très dommage dans les calculs financiers bon sauf si c'est dans votre poche bien sûr donc ça par rapport au type réel je tiens à pororter votre attention là-dessus le mieux si vous faites du financier c'est décimal vous éviterez beaucoup des problèmes et si vous êtes dans la science float ou double vous pouvez voir le tableau précédent selon la granularité et la taille de ce que vous voulez stocker choisissez l'un ou l'autre depuis la version 7 de c#arp on peut aussi utiliser un séparateur pour les gros chiffres par exemple avant quand je voulais stocker un milliard dans un entier et bien j'avais un de 90 et il fallait que j'entraîne mon œil à créer des groupes maintenant je peux les séparer par exemple comme ici grâce à undor score et finalement le suffixe n'est obligatoire que s'il existe une ambiguïé par exemple si j'ai une Var mon entier est égal à 16 par défaut le compilateur va dire il s'agit d'un int mais si je rajoute le suffixe UL et bien je dis que je veux un unsigned long et dans ce cas la le type de ma variable ne sera pas un entier déduit mais bien unsign long donc le suffixe n'est obligatoire qu'en cas d'ambiguïé encore une fois je vous invite à vous procurer la table de référence des types numériques pour la garder précieusement au cas où vous en aurez besoin dans cette vidéo nous allons voir en détail les types textuels nous avons déjà travaillé avec les chaînes de caractères dans les vidéos précédentes on a vu d'ailleurs que pour définir une chaîne de caractère il suffit de mettre la valeur entre guillemets comme dans l'exemple à l'écran string prénom est égal à entre guillemets Christophe mais donc qui dit chîn de caractère dit ensemble de caractère ainsi vous vous doutez bien qu'il existe un type pour identifier un caractère unique c'est assez simple il s'agit du type car char qui peut qui se dit généralement car pour caractère mais peut également se dire char par habitude pour définir un car c'est aussi simple que pour définir une chaîne de caractère on va utiliser la même syntaxe que pour déclarer une variable comme ici à l'écran tout en bas nous aurons car a est égal à la valeur a mais cette fois-ci petite nuance il ne s'agit pas de guemet mais bien d'apostrophe c'est ainsi que le compilateur peut faire la différence entre une chaîne de caractère et un caractère unique lorsque vous utilisez les guemets il s'agit d'une chaîne de caractère lorsque vous utiliser les apostrophes il s'agit d'un caractère unique attention définir plusieurs caractères entre apostrophe sauf des exceptions qu'on va voir dans la slide suivante va provoquer une erreur de compilation il n'est pas possible d'écrire car a est égal à entreapostrophe AB c'est illicite car il s'agit de deux caractère est de fait une chîne et non pas un caractère unique cela étant dit il y a certains caractères qui sont un petit peu particuliers et qui vont nécessiter en l'occurrence un traitement particulier en fait un caractère est un petit peu spécial parmi tous ceux qui existe c'est le caractère antilash ce caractère est appelé le le caractère d'échappement et grâce à ce caractère d'échappement on peut définir des valeurs spéciales ou échapper une valeur on va prendre un exemple simple pour que vous puissiez comprendre le fait qu'une chaîne de caractère soit entourée de part et d'autes de guillemets comment est-ce que moi je peux dire dans ma chaîne je veux des guillemets par exemple jacques a dit deux points ouvrez les guillemets debout comment est-ce que je peux définir cette chaîne de caractère en cécharpe ou pour en revenir au caractère une unitaire comment est-ce que je peux dans une variable stocker le caractère apostrophe étant donné que un caractère est entouré par deux apostrophes et bien grâce à l'antilash on peut réaliser cette opération voici un petit tableau de référence qui définit les caractères spéciaux à l'aide de l'antilash on voit par exemple que si nous mettons antilash apostrophe on peut stocker dans un dans une variable de type car l'apostrophe de la même façon si on met antislash guillemets on va pouvoir stocker un guillemet dans une chaîne de caractère l'antillash lui-même étant un caractère spécial si on veut le stocker dans une chaîne on est obligé de l'échapper ensuite le reste de la liste nous montre quelques caractères un petit peu particuliers qui s qui sont tous à mettre dans une chaîne de caractère et non pas dans un car unitaire qui nous permettent par exemple de définir une tabulation à soit la ligne ou autre prenons un exemple pour l'apostrophe voici comment nous pouvons représenter le caractère apostrophe en code je vais écrire car apostrophe est égal à entreapostrophe anti/ash apostrophe on voit d'ailleurs que Visual Studio code nous aide parce qu'il va mettre dans une couleur différente le contenu par rapport aux apostrophes qui encadrent la valeur on voit ici que antiash apostrophe est en jaune ou orange clair alors que les deux apostrophes qui encadrent la valeur sont en orange plus foncé on aura la même logique avec les guemets comme j'ai dit dans les précédent si on veut stocker la phrase jacques a dit debout et bien nous allons devoir échapper les guillemets à l'intérieur de la chaîne de caractère ainsi pour mettre un guillemet dans une chaîne de caractère nous mettrons anti slash guillemet et de la même façon nous voyons que Visual Studio nous Colorit ça en orange clair ou en jaune pour l'antillash c'est un scénario qui est assez courant lorsqu'on travaille avec Windows par exemple les chemins sous Windows sont caractérisés par une séparation en antilash entre les dossiers par exemple ici pour accéder au au chemin vers fichier.txt ce sera C de antiash DOX antiash fichier.txt mais vu que je suis dans une chaîne de caractère je suis obligé d'échapper l'antillash on l'a vu pour l'apostrophe l'antillash peut être utilisé pour représenter directement un caractère dans la table Unicode j'ai mis ici le lien vers Wikipédia vous pouvez très bien le retrouver en tapant directement table de caractère Unicode et en cherchant le lien sous Wikipédia ou en recopiant ce lien à la main nous allons y accéder ensemble et je vais vous montrer de quoi il en retourne je suis ici dans le navigateur sur ma machine de démonstration sur la page de Wikipédia qui parle de la table des caractères Unicode si je descends au sein de cette page je vais retrouver une table qui m'indique les caractères en Unicode la majorité des caractères sont assez simples à écrire si je prends par exemple cette première table on voit ici les lettres de l'alphabet et bien ces lettresl sont assez simples à écrire sans avoir à passer par le Code Unicode cependant si je descends un petit peu plus on voit des caractères un peu plus spécifiques par exemple ici nous avons le caractère copyright qui peut être compliqué à écrire directement avec le clavier si on ne connaît pas le raccourci néanmoins on peut voir que la table nous renseigne la position exacte et le code du caractère afin que nous puissions utiliser dans un caractère au niveau de notre code c#arp c'est ainsi à l'intersection de la ligne et de la colonne en en faisant la jonction du 000a avec la valeur 9 qu'on va pouvoir stocker le caractère copyright par exemple pour donner un autre exemple si je voulais stocker le caractère comme ceci marque commerciale dépôt de marque et bien j'iraai lire la valeur dans la ligne qui est 00a avec un 0 et j'irai dans la colonne et je vois que c'est la colonne E donc je substituerai la dernière valeur de la de la ligne à savoir le Z0 par le E qui est ici pour écrire ce caractère là sans plus attendre je vais vous montrer comment cela se passe au sein de Visual Studio code je suis donc dans Visual Studio code de retour dans le fichier programme.cs du projet mon premier projet et je souhaite écrire le caractère copyright on l'a vu dans la table unique code il s'agit de 00a suivi de du chiffre 9 ainsi je serais tenté d'écrire cela par exemple caractère copyright est égal à entreapostrophe parce que je ne veux que le caractère et là je serais tenté d'écrire 0A 9 néanmoins cela ne fonctionne pas comme on le voit ici j'ai c'est souligné parce que j'ai comme le dit le compilateur il y a trop de caractères dans le littéral de caractère ce qui veut dire que j'ai stocké une chaî au lieu d'avoir stocké la valeur on serait tenté de dire il suffit de mettre un antilash mais en faisant cela on constate qu'il n'y a que le premier caractère à savoir le zé qui est échappé ce n'est donc pas la bonne solution pour que ce soit valide il faut que j'utilise antiash U pour dire que je veux utiliser une valeur Unicode et ensuite après anti slash u je vais mettre la valeur en tant que telle donc celle qu'on a trouvé sur Wikipédia à savoir 000 à 9 et ainsi je n'ai plus heur de compilation et je vais pouvoir stocker le caractère copyright de telle sorte que si je décide de l'écrire sur la console et que je lance l'exécution je mets dans le terminal et je vais dans mon premier projet je tape DNET run je vais donc avoir hello world j'apprends le c#arp et le caractère copyright on le voit ici dans la console j'ai bien le caractère copyright vous avez vu comment vous pouvez exploiter la table Unicode afin d'insérer des valeurs Unicode directement dans les caractères ou dans vos chaînes de caractères car oui cette valeur là peut directement être inséré ici au sein d'une chaîne de caractère tout à fait classique on n'est pas obligé de passer par le type car comme on l'a vu la manipulation des chaînes de caractère est assez facile il faut savoir également qu'on a une facilité d'échappement grâce à une syntaxe qui est un petit peu particulière jusqu'à présent on est obligé d'utiliser l'antilash afin d'échapper n'importe quel caractère une autre syntaxe permet d'éviter l'utilisation de l'antilash le caractère arobas avant les guemets d'ouverture de chîn permet de ne pas à avoir à échapper les antilash si on reprend l'exemple de tout à l'heure où nous avions le chemin vers un fichier sous Windows avec ces deux points antiash doc antilash fichier.txt il était nécessaire d'échapper par deux fois les antilash si cela est pénible et pourrait nuire à la à la lecture on peut mettre l'arobase devant et grâce à cette arobase les antislash n'auront pas besoin d'être échappés à noter cependant que ça empêchera de fait l'utilisation des caractères spéciaux parce que l'antillash ne sera pas échappé ainsi on pourrait par exemple réécrire ce que nous avons vu précédemment de cette façon nous avons ici une chaîne de caractère qui s'appelle chemin Windows simple qui commence bien par un un arobas avant le guillemets d'ouverture et on peut voir dans la chaîne que les antilash ne sont pas doublés donc ne sont pas échappés et on voit également que les caractères qui suivent l'antillash ne NT pas une coloration particulière ce qui veut dire qu'on ne peut pas utiliser les caractères spéciaux il est donc recommandé d'utiliser le symbole Obas devant une chaî si on est sûr qu'on veut utiliser l'antillash sans faire de sans faire l'utilisation de caractères spéciaux comme dans cet exemple assez classique un chemin sous Windows de fait peut-être que vous vous posez la question mais dans ce cas comment est-ce que je peux échapper le guillemet si je veux écrire jacqu a dit debout avec un arobase en début de Chan comment est-ce que je vais pouvoir faire pour échapper le guillimet et bien il suffit simplement de le doubler comme le montre cette deuxième phrase jacad 2 ou jacad assis on peut voir que la rebase en début de chîne avant les guillemets nécessite que lorsqu'on veut utiliser les guillets dans la chîe on doit le doubler et on voit d'ailleurs que les deux guillemets doublés sont ici de la même couleur que l'antillash dans les exemple précédent afin de clôturer les types textuels en détail lorsqu'on utilise de chîn il est possible de mettre entre guillemets une chaîne dans l'autre grâce à un procédé qui s'appelle l'interpolation je vous invite à noter ce terme et à le retenir car je l'utiliserai assez souvent pour parler de cette technique à l'instar de ce qu'on a fait avec le caractère Obas dans la slide précédent en début Chan l'interpolation se fait grâce au caractère dollar ainsi en mettant un dollar avant le premier guillemet on va pouvoir insérer une valeur entre accolade au sein d'une chî et généralement on s'en sert pour injecter une variable dans une chaîne prenons l'exemple suivant j'ai ici string prénom est égal à Christophe ensuite je veux écrire bonjour Christophe comme on l' comme on a voulu le faire dans le premier exercice et bien pour ma chaîne qui va contenir bonjour Christophe je peux utiliser l'interpolation de cette façon j'écris ma chaîne string bonjour est égal dollar ouvrez les guillemets bonjour et entre accolade à l'endroit où je souhaite que la chaîne soit inséré je vais écrire en tracolade la le nom de la variable que je veux insérer et ensuite je peux continuer ma chaîne ou dans le cas présent fermer les guillemets ainsi quand on exécutera ce programme si on décide d'afficher la valeur de la chaîne bonjour la variable contiendra bonjour Christophe parce que la partie acolade prénom sera remplacé par la chaîne prénom il est maintenant temps de passer à un exercice le but de cet exercice est de demander le nom de l'utilisateur et son âge et lui dire bonjour prénom vous avez âge an pour bien commencer vous pouvez créer une application console dédiée ou reprendre l'application console sur laquelle vous avez déjà commencé l'exercice bonjour prénom on utilisera de la même façon la méthode console.r line pour afficher une valeur je rappelle que la valeur entre parenthèses de la méthode console right line peut-être également une variable ou une constante on utilisera la méthode console.reline pour lire les valeurs et nous allons stocker le prénom et l'âge dans des variables pour finalement is l'interpolation que nous venons de voir pour construire la phase finale vous avez normalement toutes les cartes en main pour réaliser cet exercice je vous laisse mettre la vidéo en pause réaliseer l'exercice et je vous donne rendez-vous dans quelques secondes pour le corriger maintenant que nous en savons un peu plus sur les types textuels et la façon de travailler avec en carp on va reprendre le projet infoerso pour l'améliorer on va demander à la personne de nous fournir également son âge et au lieu d'afficher bonjour prénom et les autres informations chacune sur des lignes différentes on va faire en sorte que tout s'affiche sur une seule et même ligne tout d'abord je vais copier-coller les deux premières lignes ici en dessous pour demander à la personne de saisir son âge et comme on peut le voir j'ai ici un soulignage en rouge tout simplement parce que j'ai déjà une varable locale qui est les prénom comme on peut le voir ici avec cette erreur une locale variable ou une fonction nommée prénom existe déjà dans ce périmètre donc ce que je vais faire ici c'est que je vais simplement renommer cette variable en âge comme ceci je vais également ajouter des lignes vides dans le code qui n'ont absolument aucune incidence sur le code et sur la performance de votre application cela me permet simplement d'aérer mes différentes lignes de code pour rendre le tout plus lisible voire même peut-être plus logique à partir de là je vais donc vouloir écrire bonjour prénom vous avez âge an je peux faire ça bien sûr sur plusieurs ligne comme on l'a déjà fait précédemment je peux aussi le faire sur une seule ligne je vais utiliser la meilleure technique à mon sens qui est l'interpolation pour faire cela il va falloir ici que je crée la chaîne complète que je veux écrire donc bonjour prénom vous avez âge an je peux donc supprimer la dernière ligne qui ne me sert plus à rien mais ici remarquez quelque chose le compilateur et le runtime c#arp ne sont pas au courant que prénom qui est ici fait référence à cette variable là alors on pourrait être mis en erreur par Visual Studio code qui fait que dès lors que j'ai surligné prénom avec mon curseur il me l'a également surligné ici il a fait une simple recherche syntaxique pour trouver exactement le même mot mais cela ne fait donc pas référence à cette variable j'en veux pour pre que si j'exécute l'application que je décide de saisir mon prénom également mon âge je vois bonjour prénom vous avez âge 1 car en effet ici c'est une chaîne de caractère simple et nulle part je n'ai précisé que je voulais que prénom qui est ici ne soit pas un texte littéral mais bien la variable pour être précis d'ailleurs le contenu de la variable qui soit placé à cet endroit de ma chaîne pour faire cela je vais utiliser l'interpollation ce qui veut dire que d'une part je vais devoir encadrer prénom par des accollades de la même façon je vais faire pareil pour âge et pour bien spécifier à ccharpe que accolade prénom doit contenir la valeur de la variable prénom je dois commencer ma chaîne par un dollar on remarquera que dès que j'ai placé le caractère dollar en début de chaî la coloration syntaxique de prénom fait référence non plus à C espèce de rouge orangé qui est pour les chaînes de caractères mais a bien pris la couleur bleu CLA qui fait donc référence ici à la variable et quand je laisse ma souris sur le texte on peut voir qu'il a bien reconnu qu'il s'agissait d'une variable locale ce qui va donc permettre à sécharpe de dire à cet endroit précis de la chaîne je vais introduire le contenu de la variable prénom si je sauvegarde et que j'exécute mon application que je refournis mes informations on peut voir cette fois-ci que tout est bien évalué parce que j'ai bonjour Chris vous avez 35 ans le contenu des variables est donc bien inséré à cet endroit de la chaîne de caractère et donc bien évalué ce n'est donc pas compliqué de travailler avec les chaînes de caractères comme vous l'avez vu avec l'interpolation c'est très simple et très facilement compréhensible de savoir où va quelle valeur si vous avez réussi cet exercice félicitations vous savez maintenant comment travailler avec les chaînes de caractè notamment pour les usages les plus courants si vous n'avez pas forcément réussi cet exercice je vous invite à revoir la vidéo et à retenter l'exercice car les manipulations de Chan sont quelque chose de très courant lorsque vous allez écrire du ccharp et il serait dommage de ne pas savoir le faire et d'être bloqué pour quelque chose d'aussi commun jusqu' présent nous avons travaillé avec des variables unitaires sans forcément les faire interagir entre elles les types que l'on a vu à savoir les numériques et les types textuels comme les chaînes de caractère supportent l'utilisation de ce qu'on appelle des opérateurs c'est très simple à comprendre les types numériques par exemple supportent l'addition ou la soustraction de deux valeurs numériques pour se faire il y a un ensemble de caractères qui est qui vont être exécutés comme des opérateurs par le runtime ainsi on aura cette listeci nous aurons le plus pour additionner de de numériques le tirer du 6 pour sstraire de numérique l'astérisque ou l'étoile pour la multiplication le slash pour la division et le pourcent pour le moduo le modulo étant le reste de la division entière ou la division euclidienne commençons de suite par un petit exercice cet exercice est très simple on va manipuler les quelques opérateurs avec les type numérique pour que vous puissiez bien commencer cet exercice je vous conseille de créer une application dédiée ou de travailler dans l'application bacassable mon premier projet et créer ensuite deux variables contenant 9 et 2 les chiffres 9 et 2 mettez-les dans des entiers int int ensuite réaliser la totalité des opérations mathématiques que nous avons vu dans le dans les slides précédents et constater les résultats je vous conseille d'afficher sur la console le résultat de chacune des opérations et ensuite revenez mettez en pause la vidéo revenez reprendre la vidéo pour qu'on puisse expliquer et constater les résultats j'espère que vous vous êtes prêté à l'exercice et que vous avez pu observer les résultats de telle sorte à ce que je l'explication que je vais vous apporter puisse prendre tout son sens faisons quelques petites explications 9 + 2 est ég à 11 il n'y a aucun commentaire à faire là-dessus de la même façon 9 - 2 est é= à 7 il n'y a aucun commentaire et 9 x 2 est é= à 18 il n'y a de la même façon aucun commentaire à ajouter cependant vous avez dû remarquer que 9/ 2 est ég à 4 et on pourrait s'attendre à un résultat logique qui serait 4 et demi néanmoins nous avons divisé un entier par un entier et je vous rappelle que le langage carpe est un langage fortement typé de cette façon la façon dont a été codé l'opérateur sur la sur les entiers fait que le résultat est lui-même un entier parce que nous avons ici le cootient d'une division euclidienne c'est-à-dire la partie entière de la division et le reste étant à part le reste étant calculé par la fonction modulo ainsi 9/ 2 est ég à 4 4 car 4 x 2 = 8 et 9 moduo 2 est égal à 1 parce que 2 x 4 + 1 est é= à 9 donc le 1 grâce à l'opérateur modulo et le reste de la division euclidienne que nous avons réalisé c-dessus cela peut être un petit peu troublant au début de se dire que quand on fait une division et bien nous n'avons pas forcément des chiffres avec une partie décimale il faut se rappeler que quand on divise une valeur enti par une valeur entière le résultat sera forcément une valeur entière de ce fait si vous avez besoin d'avoir une partie décimale il ne faudra pas stocker les variables 9 et 2 dans des types entiers mais bien dans des type qui supporte les parties décimales comme par exemple le type décimal ou le type float ou encore le type double maintenant voyons les opérateurs textuels pour les chaînes de caractère dans le cas des chaînes de caractères un seul des opérateurs que nous avons vu pour les Numériques a été implémenté et le résultat de cet opérateur revient à faire une concaténation je vous invite à noter ce terme afin qu'il ne vous paraisse pas étranger lorsque je le répéterai dans des vidéos ultérieures on utilisera ainsi le caractère plus à l'instar d'une addition entre deux numériques pour concaténer de chînes c'est-à-dire les mettre les mettre l'une à la suite de l'autre par exemple ici j'aiécré une variable s'appelle bonjour Chan qui contient la chaî bonjour avec un espace à la fin et je la concataine avec la chaîne Christophe comme ça j'ai une seule et même chaî qui s'appellera bonjour Christophe j'avoue que dans le cas de cet exemple l'intérêt de la concaténation est nul et la concaténation prend tout son intérêt lorsqu'on utilise par exemple des variables si je reprends le même exemple mais que je stock bonjour et prénom dans deux variables différents et bien je peux récupérer une nouvelle chaîne qui est bonjour Christophe en concaténant deux variables de type chaî de caractère afin que vous puissiez assimiler pleinement ce principe on va se prêter à un petit exercice je vous invite à reprendre l'exercice que vous avez fait précédemment avec l'interpolation mais au lieu d'utiliser l'interpolation comme c'est écrit à l'écran à l'instruction numéro 4 en bas utiliser plutôt la concaténation pour construire la phrase finale je vous invite donc à reprendre soit une nouvelle application pour vraiment prendre en main le concept de création de nouvelle application DNET et les méthodes de base comme console. WR Line et console. readline ou de dupliquer la ligne que vous aviez fait dans l'exercice précédent avec l'interpolation pour le faire cette fois-ci par concaténation mettez la vidéo en pause faites l'exercice je vous retrouve dans quelques secondes pour la correction comme nous l'avons vu dans les slides précédemment on peut se servir du caractère plus pour concaténer c'est-à-dire coller ensemble deux chaînes de caractères pour n'en former qu'une dans l'exercice précédent on s'est servi de l'interpolation afin de dire au compilateur cécharp et au runtime c#arp à quel endroit de notre chaîne de caractère doit être inséré telle variable on voit le résultat de cela à la ligne 7 c'est de loin mon approche favorite cependant il peut arriver parfois que l'usage de la concaténation soit utile et il est donc nécessaire d'apprendre à l'utiliser et voir comment cela fonctionne on va donc vouloir garder ce qu'on a fait au début c'est-à-dire tout ceci pour récupérer les informations mais au lieu d'utiliser l'interpollation comme à la link 7 on va utiliser la concaténation je vais donc simplement copier coller la ligne et au lieu d'utiliser l'interpolation avec le dollar je vais utiliser la concaténation pour cela il faut que j'utilise le caractère plus entre mes différentes chaînes de caractères je suis donc obligé d'encadrer la variable prénom par de plus ce qui veut dire que au lieu d'avoir ici des accollades il va me falloir des plus comme ceci et ce sera pareil pour la variable âge donc je les encadre de plus cependant ici à l'instar de ce qu'on a vu dans la première vidéo si je laisse ma chaîne de caractère en l'état je vais simplement avoir l'évaluation littérale du caractère plus dans la chaîne de caractère laissez-moi vous montrer rapidement de quoi je veux parler si je tape mon prénom et mon âge ici l'interpolation est bien effectuée mais en bas pour la concaténation cela ne fonctionne tout simplement pas pour cela je vais être obligé de transformer cette partie-là en chaîne de caractère cette partie-là enchaîne de caractère et celle-ci enchaîne de caractère et les trois de façon indépendante pour se faire je vais simplement fermer et ouvrir les guillemets comme ceci autour des éléments que je veux transformer en chaîne de caractères indépendantes comme cela et donc vous remarquez ici que je n'ai plus d'erreur de compilation que les plus sont bien placé entre une chaîne de caractère et une autre quand bien même cette chaîne de caractère est sous forme de vari que ce soit à gauche ou à droite le plus va donc transformer ces deux chaînes de caractères en une seule donc j'ai ici bonjour dans une chaîne de caractère prénom dans la variable vous avez dans une autre chaîne ge dans la variable et en dans une chaîne de caractère indépendante on va avoir le même résultat lançons l'application si je redonne mes informations on peut voir ici que j'ai le même résultat à noter qu' on a une petite subtilité dans la console de dbug on a ici un petit 2 au début de la ligne qui m'indique en fait que cette phrase est présente deux fois dans la sortie c'est pourquoi la console de débug évite de faire apparaître deux fois la même phrase et dit simplement qu'elle est deux fois dans la sortie parce qu'elle est identique pour en avoir le CNET je vais simplement ouvrir un nouveau terminal je vais taper DNET run et je vais faire exactement la même chose et ici contrairement à la console de dbug on peut voir que la chaîne est bien doublée ce qui veut dire que cela fonctionne bien donc vous avez ici à l'écran à la ligne 7 et à la ligne 8 le même résultat la même phrase qui va reprendre nos deux variables les mettre dans une phrase de résultat la première avec l'interpollation la seconde avec la concaténation je trouve la phrase de la ligne 7 plus facile à lire parce qu'on voit directement où est inséré la valeur et le peu de décoration qu'on a vient simplement du fait de la présence des accolades pour moi c'est moins compliqué à lire que la ligne 8 mais les deux ont le mérite d'exister et si vous avez réussi à transformer la chaîne qui utilise l'interpolation pour avoir le même résultat avec la concaténation félicitations vous savez maintenant comment travailler avec les chaînes de caractères que ce soit avec de l'interpolation ou de la concaténation vous êtes maintenant prêt à affronter tous les défis autour de la manipulation de chaînes de caractère si vous n'avez pas réussi à faire la concaténation je vous invite à revoir la vidéo et à vous assurer d'avoir bien bien compris ce serait en effet dommage de ne pas connaître cette technique facile et simple qui pourraitre être utile plusieurs fois quand vous allez réaliser du code c#arp nous avons vu les opérateurs pour les types numériques et nous avons également vu l'opérateur de concaténation pour les chaînes de caractère parmi les trois types de bases que nous avons étudié jusqu'à présent il y en a un sur lequel n'avons pas encore vu les opérateurs il s'agit des bouléens pour rappel un bouléen est une valeur valant vraie donc trou ou faux false ainsi pour savoir si quelque chose est vrai ou est faux donc produit un boulet un il faut faire une comparaison si par exemple je veux comparer deux valeurs entières savoir si dans ma variable a j'ai la même valeur que dans la variable B je dois les comparer entre elles ainsi je peux tester l'égalité de ces deux variables grâce à un opérateur qui est le double égal et non pas égal en C chararpe l'égal unitaire est égal à une affectation le double égal est vos comparaison attention à ne pas faire cette erreur lorsque vous allez écrire du code ultérieurement et de réfléchir en français en disant si A est égal à B et de ne mettre qu'un seul égal car cela produit une affectation et non pas une comparaison afin que cela soit plus clair au niveau du code voici un exemple de code ici j'ai les variables A1 et A2 qui contiennent respectivement 42 et 43 et afin de savoir si ces variables contiennent la même valeur j'ai cris un boulet 1 qui s'appelle ego qui est égal attention ici avec un seul égal à A1 est-il égal à A2 et j'ai ici le double égal le fait d'avoir mis cette opération cette affectation de variable dans une seule ligne montre bien la différence entre l'égal simple et le double égal donc vous vous doutez bien que ici si j'exécute ce code et que j'affiche la valeur de la variable ego sur la console elle me dira que c'est faux car 42 n'est pas égal à 43 si vous faites ce code sur votre ordinateur et que le résultat est égal à trou c'est probablement que vous avez fait une faute de frappe et vous avez comparé une variable avec elle-même sinon il est grand temps de changer d'ordinateur on a le double égal pour faire la comparaison maintenant on peut pour tester l'égalité est-ce que deux choses sont égales maintenant on peut également vouloir tester la différence et dans ce cas on remplacera le premier égal dans le double égal par un point d'exclamation c'est l'opérateur point d'exclamation égal qui veut dire différent et comme ça on peut tester Bouen différent A1 est-il différent de A2 et là cette fois-ci la variable différent vaudra trou car 42 est différent de 43 il y a également des opérateurs mathématiques traditionnels qui vont nous aider à produire un Boulen nous avons vu la vérification de l'égalité ou de la différence si on va comparer deux variables numériques entre elles on peut utiliser les opérateurs classiques supérieur supérieur ou égal a inférieur inférieur ou égal a le caractère pour chacun de ces opérateurs est affiché ici à l'écran on utilisera le chauvron fermant ou ouvrant exactement de la même façon qu'on le ferait dans une écriture mathématique traditionnelle la seule subtilité étant le supérieur ou égal ou l'inférieur ou égal étant donné que on utilise supérieur ou égal le premier caractère à arriver est le supérieur suivi d'un égal et cela fonctionne de la même façon avec l'inférieur ou égal reprenons notre exemple nous avons ici A1 et A2 qui sont 42 et 43 est-ce que A1 est plus grand que 10 j'écrirai cela avec A1 chevron fermant 10 10 on a la même notation qu'on pourrait avoir en mathématique et cela produit un boulien est-ce que A1 est supérieur à 10 bien sûr vous vous en doutez cela vaudra trou parce que 42 est plus grand que 10 ensuite imaginons que je veux tester que A2 est inférieur ou égal à 100 je l'écrirai de cette façon A2 chevron ouvrant ég 100 et là vousz bien que également la variable sera égale à trou parce que 43 est un ou égal à 100 donc vous pouvez utiliser ces opérateurs afin de comparer des Numériques entre eux et de produire un Boulen symbolisant le résultat de votre opération que ce soit pour l'égalité la différence ou la comparaison de valeurs la conversion entre types je rappelle que le langage c#arp est fortement typé cela veut dire qu'il n'est pas possible de changer le type d'une varable qui a déjà été déclarée par exemple si j'ai déclaré une variable string prénom est égale à entre guillemets Christophe je ne pourrais pas par la suite dire que finalement ce prénom n'est plus une variable de type String mais devient une variable de type int et je lui affecte une autre valeur ce n'est pas possible en c#arp comme ça pourrait l'être dans d'autres langages comme javascript pour ne citer que lui néanmoins il peut arriver que l'on ait besoin de convertir une variable qui est dans un type A vers un type B le cas qui va nous arriver est par exemple de transformer une chaîne de caractère en entier je prends un exemple très simple vous avez demandé à l'utilisateur de saisir son âge son âge est récupéré depuis la saisie de la console qui est une chaîne de caractère néanmoins si on a envie de faire des opérations avec les opérateurs numériques sur l'âge de la personne on ne pourra pas appliquer ces opérateurs car l'âge récupéré est une chaîne et non un entier il existe en cécharpe de nombreuses façons de créer une nouvelle variable et je précise bien créer une nouvelle variable d'un autre type et ce à partir d'une variable déjà définie ce que je parle dans cette vidéo pour que ce soit clair et bien de créer une nouvelle variable dans le type que l'on souhaite à partir d'une variable existante dans un type déjà défini donc ici une variable de type chaîne de caractère vers une nouvelle variable de type entier commençons par la transformation d'un type quelconque vers une chaîne c'est un des besoins les plus courants c'est d'avoir une chaîne de caractère depuis un type quelconque sur certains types comme les entiers par exemple on pourrait légitimement se poser la question d'un intérêt de ça ça mais si on prend des types plus complexes prenons par exemple une date et bien avoir une date vers une chaîne de caractère permettrait d'afficher la date sur un document nous verrons pourquoi lorsqu'on fera le module sur la programmation orientée objet mais chaque élément chaque type en c#arp possède une méthode entre autres particulière qui a la méthode tout string étant donné que tout en anglais veut dire ver en français on pourrait traduire cette méthode vers chaî de caractère tout string l'idée est d'appeler cette méthode sur un type quelconque et de récupérer en retour une la valeur de ce type là en chaîne de caractère on aurait ainsi la possibilité de transformer un entier en chaîne de caractère comme ceci nous avons ici une variable appelée valeur entière qui est égale à la valeur numérique 42 ensuite nous avons une variable de type String appelé entier Chan qui est égal à la valeur entière point to string et le point to string est bien encadré en rouge ce qui veut dire que sur n'importe quelle variable que vous avez de n'importe quel type vous pouvez appeler point string afin de récupérer une chaîne de caractères à noter que cela est également possible pour une variable de type String je pourrais par exemple avoir string machine est égale à une valeur entre guillemets et avoir une autre valeur string machine 2 est égale à machine 1 point string l'intérêt est cependant très limité étant donné que nous avons déjà de base une chaîne de caractère maintenant voyons le cas qui nous intéresse un peu plus à savoir transformer vers un autre type qu'une chaîne de caractère je reprends l'exemple que j'avais dit précédemment lorsqu'on récupère la saisie d'un utilisateur sur une console sur un terminal la valeur qu'on obtient est une chaîne de caractère comme je l'ai dit pour certaines opérations comme par exemple comparer avec un autre entier faire une addition ou tout autre type d'opération il va falloir que nous convertissions cette valeur vers un entier il y a plusieurs façons également de faire cette opération en c#arp il existe une classe qui s'utilise comme la classe sol que l'on a utilisé jusqu'à présent qui s'appelle converte et cette classe expose des méthodes permettant de transformer une valeur vers une autre sous réserve que bien entendu la transformation soit possible prenons un exemple ici je récupère dans une chaîne de caractère la valeur en tant que chaîne 33 si je veux avoir cette valeur au sein d'un entier je vais déclarer une une nouvelle variable int 33 et j'appellerai la méthode tout int 32 de la classe converte un petit peu comme on a fait avec console.r Line ou console.re line je taperai convert point to in 32 entre parenthèses je lui passerai la valeur que je veux convertir attention il faut que la valeur soit convertible si dans valeur chaîn j'avais le prénom la classe converte ne serait pas en capacité de transformer le prénom en entier et renverraz donc une erreur qui provoquerait le plantage de mon programme soyez donc vigilant à cela nous verrons par la suite d'autres méthodes permettant de faire cette conversion de façon plus sécurisée comme je viens de le stipuler la classe converte est effectivement très pratique et très facile à utiliser mais beaucoup de types en ccharp exposent eux aussi une méthode particulière appelée pars qui permet de faire la transformation cette méthode offre l'avantage de directement être utilisable sur le type que l'on souhaite récupérer par exemple ici je récupère depuis la console une saisie grâce à la méthode console.reline si après je veux l'avoir en entier je peux bien entendu utiliser convert comme on l'a vu dans le slide précédent mais je peux aussi utiliser la méthode parse disponible directement sur le type int en tapant int.pse et en lui passant la valeur les deux méthodes donneront le même résultat j'obtiendrai un entier en sortie ou une erreur si la conversion n'est pas possible on verra cependant plus tard que utiliser les méthodes de parcing de transformation donc sur la classe de destination offre une flexibilité que la classe converte ne possède pas attention je précise bien que au niveau de connaissance actuelle vous pouvez utiliser une solution comme l'autre indistinctement car le résultat sera totalement identique je vous propose un petit exercice afin de mettre cela en pratique l'exercice est le suivant vous allez retravailler le bonjour prénom vous avez âge en soit en le séparant dans une application console dédiée comme c'est écrit à l'écran soit en reprenant l'exercice précédent et vous allez stocker le prénom et l'âge dans des variables avec une distinction le prénom sera stocké dans une variable de type string et l'âge dans une variable de type int et pour ne pas avoir de problème nous allons utiliser l'interpolation pour afficher la phrase attendue car oui l'interpolation permet d'injecter n'importe quel type de variable au sein d'une chaîne de caractère c'est le compilateur qui se chargera d'appeler la méthode to string sur votre variable afin d' obtenir une chaîne de caractère je vous laisse donc mettre la vidéo en pause pour ce petit exercice et je vous donne rendez-vous dans quelques secondes afin de voir le corriger ensemble comme nous l'avons vu dans les slides certains Typs vont nous permettre de convertir d'un type à l'autre car en effet contrairement à d'autres langages comme javascript par exemple en ccharp une fois qu'une variable est créée avec un type particulier il n'est pas possible de changer par exemple ici nous nous avons veuillez saisir votre âge et nous récupérons le contenu dans une variable de type String donc chaîne de caractère après tout c'est logique parce que la méthode console.reline nous renvoie une chaîne de caractère étant donné qu'elle a lu du texte depuis la console pour savoir si les valeurs qui sont entrées sont des nombres il faut tenter la conversion on peut le faire de différentes façons comme on l'a vu dans les slides on peut tenter la méthode converte donc par par exemple ici je vais déclarer une variable agentier et je vais utiliser convert avec to int 32 alors on remarquera ici qu'il y a effectivement tout avec plusieurs types de int int 16 int 64 u in et ainsi de suite je vous renvoie vers la vidéo où est-ce que je fais un zoom sur les types numériques pour vous rafraîchir la mémoire sur les différents types d'entiers par défaut le type d'entier à utiliser est donc int 32 ou l'alias et int int comme on peut le voir ici au début de la ligne 6 et donc c'est celui-ci que je vais spécifier et là on peut voir qu'il prend en paramètre n'importe quel type qu'il va essayer de convertir et donc Visual Studio code nous propose ici l'âge en premier choix et je vais donc cliquer dessus en faisant ceci je vais donc dire à c#arp de prendre le contenu de la chaîne de caractère âge et de la convertir en entier ce qui veut dire qu'il va analyser le contenu de la chaîne pour tenter de voir si ce sont bien des chiffres qui son sont dedans afin de le ranger dans un entier stocker l'âge en tant qu'entier peut être utile notamment pour faire des comparaisons numériques on va d'ailleurs y venir prochainement mais soyez vigilant tout ce qui est représenté à base de chiffres n'est pas forcément de l'entier un exemple simple dans lequel beaucoup de développeurs débutants tombent facilement c'est la notion de code postal tout du moins en France un code postal en France est composé généralement de cinq chiffres il y a des exceptions à cette règle et c'est d'ailleurs du fait de ces exceptions qu'il faut éviter de stocker un code postal en tant qu'entier il va être préférable de le stocker en tant que chin de caractère et éventuellement de rajouter certaines contraintes comme dire par exemple qu'il ne faut pas dépasser cinq caractères parce que certains codes postaux peuvent avoir une lettre donc on va éviter de stocker ça en tempant qu' entier d'autant plus qu'il n'y a aucune raison valide sur un point de vue algorithmique de stocker un code postal en tant qu' entier vu qu'on ne va y appliquer aucune opération numérique soyez donc sûr quand vous faites une transformation d'une chatte de caractère dans un nombre numérique que c'est bien à des fins algorithmiques parce que vous avez envie de profiter d'éléments autour des numériques pour l'âge ici ça a du sens qu' on le verra juste après donc à partir de là je vais pouvoir prendre l'âge entier et le mettre ici à la place de âge vous remarquerez quelque chose d'intéressant j'ai donc remplacé la variable âge par âge entier qui est donc de type int un entier donc et vous pouvez le voir que que ce soit pour l'interpolation ou pour la concaténation cela ne génère aucune erreur de compilation en effet pour l'interpolation par défaut la valeur que vous allez mettre entre les accolades va être converti en chaîne de caractère avec un two string ce qui veut dire tout simplement que peu importe le type qu'on va mettre en tracolade tout string sera appelé dessus pour en avoir une représentation textuelle afin de pouvoir l'insérer dans une chaîne de la même façon quand vous faites l'usage du plus avec une chaî de caractère comme vous pouvez le voir quand je laisse ma souris dessus si vous avez une chaîne de caractère à droite ou à gauche d'un autre objet et on peut voir ici que le paramètre est de type Object ce qui veut dire n'importe quel type dans le langage c#arp vous allez avoir une chaîne de caractère qui va être produite je vais donc sauvegarder le fichier et tenter d'exécuter l'application je vais donc saisir mon prénom et mon âge et comme on peut le voir cela fonctionne très bien l'âge que j'ai saisi ici a donc été converti avec succès en entier cependant il faut être vigilant parce que si la conversion échoue comme vous allez le voir cela va faire planter notre programme par exemple si ici je mets ABC vous pouvez le voir que j'ai ce qu'on appelle une exception une erreur alors par d'inquiétude on va apprendre comment gérer ça plus tard au niveau du cours mais ce qu'il faut juste retenir ici c'est que l'utilisation de la méthode converte to 32 va faire planter votre application si le contenu ne peut pas être converti de la même façon je peux utiliser int point parse comme méthode et je vais donc ici avoir le même comportement c'est-à-dire la conversion d'une chaîne de caractère en entier si je relance l'application que je ressaisis mes informations et que je mets bien un entier cela fonctionne bien et de la même façon si je décide de saisir une valeur qui n'est pas un entier j'ai également un plantage avec une exception donc le même résultat qu'avec la classe converte il y a une autre méthode qui peut être utilisée c'est la méthode trips qui est un petit peu particulière donc je vais pas m'y attarder dans cette vidéo tout simplement parce que dans cet exercice je vous avais demandé d'utiliser la méthode parse ou la méthode converte ce qui était largement suffisant si l'utilisateur saisit une valeur numérique donc si vous avez réussi cet exercice que ce soit avec in point parse ou avec converte félicitation vous savez maintenant comment transformer une chîne de caractère en entier comme vous avez pu le voir avec la classe converte les méthodes tout quelque chose il y en a beaucoup ce qui veut dire qu'il est possible d'essayer de convertir un type x vers un type y soyez toujours vigilant que la conversion soit du domaine du possible ce n'est pas la peine d'essayer de convertir des objets qui ne sont pas du tout en rapport entre eux et de même soyez vigilant comme vous l'avez vu juste à l'instant si la valeur ne peut pas être convertie ça va faire un plantage donc vous apprendrez plus tard comment gérer ces éventuels plantages pour éviter qu'il casse toute votre application mais soyez quand même vigilant par rapport au coût que ça va impliquer en terme de performance maintenant que nous savons comment produire un bouléin avec tous les opérateurs et tous les cas que nous avons vu et bien il est grand temps de tester la valeur parce que en effet avoir un boulet un tout seul à part pour l'afficher ne va pas présenter de grand intérêt s'il n'est pas testé pour une branche de code par exemple si on veut comparer que deux éléments sont égaux pour exécuter une partie du code uniquement si ces deux valeurs sont égal et bien dans ce cas-là on va utiliser une instruction un petit peu particulière qui est l'instruction if if se traduisant par si en français l'instruction a une syntaxe assez simple c'est-à-dire qu'on va écrire if if et entre parenthèses nous allons mettre le Boulin que l'on souhaite tester soit par le biais d'une variable affectée au préalable soit directement en écrivant le test une fois que j'ai écrit entre parenthèses la le test de la condition et bien je vais à la ligne et je vais entre une acolade ouvrante et une acolade fermante écrire les instructions c#arp qui seront exécuté que si l'instruction if renvoie que si le Boulen de l'instruction if est égal à trou donc on teste la valeur bouléenne entre parenthèses et on définit à la suite de cette instruction if entre parenthès le bouléen entre acolade le code à effectuer si le Boulin qui a été testé vaut trou ainsi le code qui suit l'instruction if entracolade ne sera pas exécuté si le Boulen est égal à false mais lorsqu'on teste une condition on a deux possibilités vrai ou faux c'est le principe du Boulen donc le bloc défini après l'instruction if ne sera exécuté que si le bouléen ou la ou la condition ou le test renvoie vrai il serait intéressant également d'avoir une alternative et de dire si c'est vrai je veux faire cela sinon j'aimerais faire cela et bien on peut le faire grâce au motclés else se traduisant en français par sinon ainsi voici la syntaxe comp complète d'une instruction avec des branches de code basé sur une condition si j'ai un boulet 1 je teste la valeur entre parenthèses si c'est vrai je vais définir entre acolade juste après le if le code à effectuer si le Boulin vaut trou s'il vaut false et bien je vais utiliser le mot-clé else pour dire sinon et je vais également définir entre acolade le code a effectué si le boulet 1 initialement testé par mon if et cette fois-ci ég à false afin que vous puissiez maîtriser ce concept là nous allons faire un exercice le but encore une fois est très simple on va de nouveau se servir de ce qu'on a fait où est-ce qu'on demande le nom d'utilisateur et son âge et on va lui dire bonjour vous avez x ans sauf que la petite différence cette fois-ci on va également écrire sur la console si la personne est majeure ou mineure on définira ainsi l'âge de la majorité en constante au début de notre programme je vous rappelle quelques indications on utilisera if et else afin d'afficher uniquement la phrase qui va bien vous êtes majeur vous êtes mineur et le test entre les deux valeurs à savoir est-ce que l'âge est supérieur ou égal à l'âge de majorité peut être directement fait entre les parenthèses du if sans avoir besoin d'affecter une variable au préalable mais sentez-vous libre de passer par une variable si cela vous est plus confortable je vous laisse mettre la vidéo en pause avec ces instructions et je vous donne rendez-vous dans quelques secondes pour le corriger parmi les mots-clés que vous allez utiliser pour coder en c#arp il est indéniable que le mot-cé if va revenir de façon quasi systématique dans tous vos algorithmes ici on nous a demandé de comparer l'âge de l'utilisateur à l'âge de la majorité qui en France est défini à 18 ans mais sentez-vous libre de prendre la valeur dans votre pays et d'afficher sur la console si la personne est mineure ou majeure la première chose à faire relativement simple qui n'a rien à voir avec le if va être de déclarer la majorité ici je la défini à 18 étant donné que c'est la valeur légale en France maintenant il va être nécessaire de comparer l'âge sous forme d'entier avec cet autre entier qui est l'âge de la majorité tout d'abord nous allons faire un peu de nettoyage dans notre code en effet nous avons ici deux variables pour l'âge on pourrait condenser ceci en disant en fait que l'âge est simplement le parce du retour de la console sous forme d'entier comme ça ce n'est plus la peine d'avoir une double variable et je peux garder âge sans le suffixe entier qui est purement technique et cela rend mon code plus lisible et plus compréhensible maintenant il va être nécessaire de comparer la majorité à l'âge avant d'utiliser le mot clé if ce qu'on va faire c'est qu'on va stocker le résultat de la comparaison dans un boulien donc on va créer ici un boulien qu'on va appeler majeur qui va comparer l'âge de la personne pour savoir s'il est supérieur ou égal donc j'utilise ici un opérateur arithmétique entre une variable de type numérique et une autre variable de type numérique donc ici j'ai défini l'âge est supérieur ou égal à la majorité vu que le caractère égal est présent ici pour l'affectation de la valeur mais également ici dans le cadre du test il peut-être des fois confortable de rajouter comme ceci des parenthèses elles ne sont en rien obligatoires mais elles peuvent aider à la lecture pour certaines personnes j'ai donc ici un boulien majeur ce boulien est une structure que je peux utiliser dans le cas de mes if pour déterminer si je prends un embranchement de code ou un autre typiquement ce que je vais mettre entre les parenthèses après le if doit être une expression bouléenne si j'ai un bouléen je peux donc tester que celui-ci est égal à trou pour déterminer que si majeur la variable majeur est égale à la valeur trou dans ce cas-là je vais afficher sur la console vous êtes majeur ici vu que ce qu'il y a entre les parenthèses d'un if doit être une valeur bouléenne il est redondant de faire un double égal trou pour vérifier que la valeur du Boulen est égale à trou car en effet le Boulen lui-même peut-être évalué ainsi je peux simplement mettre if majeur c'est exactement l'équivalent de ce qu'on avait avant je vais évaluer si le contenu de ce bouléen est égal à trou en effet le if va évaluer la condition bouléenne donc va évaluer le contenu du bouléen on n pas besoin de faire une comparaison inutile et donc si c'est faux ça veut dire que la personne est mineure l'inverse du if va donc être traité par le mot-cé else en fait en anglais if veut dire si else voulant dire sinon c'est assez simple à comprendre si majeur est vrai je rentre dans ce bloc de code sinon je rentre dans celui-ci et là je vais donc mettre console WR Line vous êtes mineur j'ai donc fait ici un embranchement de code basé sur une valeur bouléen qui va comparer l'âge de la personne à une constante qui est la majorité bien entendu ce n'est en aucun cas limité à des comparaisons de numérique vous allez faire des tests sur beaucoup de choses y compris sur des cas caractère y compris sur des chaînes de caractère bref vous allez voir il y a beaucoup de possibilités au fur à mesure de votre apprentissage vous allez découvrir d'autres conditions possibles mais la structure reste toujours la même if else vous pouvez aussi rajouter un else if pour faire un sinon si par exemple si la première condition est fausse on va vouloir tester peut-être une autre condition au lieu de faire un simple sinon et dans ce cas-là on va simplement après le else rajouter comme ceci majeur égal false alors dans le cas très précis de notre exemple c'est purement inutile vu que majeur est Boulen et qu'il ne peut valoir que deux valeurs vrai ou faux donc le else if est totalement dispensable else suffit mais comme vous le voyez ici à l'écran la syntaxe va être simplement d'enchaîner les else if éventuels si vous souhaitez tester plusieurs conditions donc je vais simplement mettre comme ceci if else et je vais tester sans plus attendre mon programme je vais commencer par tester avec mes informations et donc sans trop de surprise vous êtes majeur je vais retester avec d'autres informations donc je vais saisir mon prénom et je vais saisir 15 et là vous êtes mineur donc j'ai bien pu évaluer l'âge de façon numérique par rapport à la majorité maintenant l'utilisation d'une variable locale bien qu'elle soit possible comme on le voit ici à l'écran n'est en aucun cas une obligation on peut directement prendre la condition qu'on a stocké dans cette variable pour la mettre ici au sein de notre if et donc supprimer la variable locale de facto étant donné que nous avons ici les parenthèses qui sont à la fois les parenthèses du if et à la fois les parenthèses pour notre affectation de variaable local qui de fait deviennent inutiles je peux donc nettoyer mon code et j'ai donc ici à l'écran si l'âge est suéri égal à la majorité vous êtes majeur sinon vous êtes mineur il peut être judicieux parfois de passer par une variable locale pour rendre le code plus explicite dans le cas d'un test aussi simple que celui-ci n'importe qui qui va lire votre code va comprendre qu'on veut tester que l'âge est supéri à la majorité pour vérifier si la personne est majeure mais parfois il peut arriver qu'une succession de tests soit plus compréhensible si on les stock dans une variable locale de type Bouen afin de nommer ce test pour lui donner plus de sens au niveau métier de votre code afin que ce soit plus compréhensible sentez-vous libre de faire comme vous le souhaitez ici donc on a le résultat de l'exercice qui permet de faire une structure de test afin de choisir l'embranchement de code en se basant sur un test qui renvoie donc une valeur boulenne en comparant des éléments numériques si vous avez réussi cet exercice félicitations parce que vous avez acquis la compétence de faire des tests qui sera sans aucun doute une des compétences les plus utiles lorsque vous allez écrire du c#arp à l'inverse si vous n'avez pas réussi à faire cet exercice prenez le temps de refaire l'exercice voir même de revoir les slides pour être sûr de bien avoir compris le if et le else parce que c'est indispensable pour n'importe quel programme c#arp que vous allez écrire par la suite continuons sur les opérateurs avec les opérateurs pour les boulens tout d'abord nous avons vu que pour tester inégalité on utilisait le double égal et et pour tester une différence on utilisait point d'exclamation égal tout simplement parce qu'en C chararpe on peut inverser la valeur d'un Bouletin grâce au caractère point d'exclamation ainsi si je prends un Bouletin appelé FO je peux le mettre égal point d'exclamation trou et ainsi il aura la valeur false bien sûr l'intérêt est nul lorsqu'il s'agit d'une valeur directe comme trou ou FALSE mais peut-être très pratique lorsqu'on veut vérifier qu'un boulien est égal à faux ou inverser sa valeur pour un test particulier nous allons rentrer maintenant dans un sujet un petit peu plus technique un peu plus pointu on a vu qu'un boulien était assez simple parce qu'il ne pouvait prendre que deux valeurs vrai ou faux donc trou ou FALSE en fait le terme bouléen vient de quelque chose qui s'appelle la l'algèbre de boule un mathématicien qui a apporté cette logique là il existe trois opérateurs qu'on peut réutiliser en ccharpe en algèbre Boulen il y a le E le ou et le ou exclusif en fait ces opérateurs vont prendre deux Bouletin et en former un seul c'est-à-dire que je vais avoir un boulet un et un autre qui vont former un résultat un Boulen ou un autre qui vont former un résultat et un Boulen ou exclusif un autre qui va former un résultat voici lesétable de référence de résultat des opérations avec les mots-clés avec les opérateurs e ou et ou exclusifs comme on le voit pour qu'un e entre deux boules un puisse renvoyer vrai il faut que les deux valeurs boulenes soient vraies si une des deux ou les deux sont fausses le résultat sera false en ccharpe on on utilisera le caractère et commercial ou espè luette dépendant de comment vous l'appelez pour réaliser une opération et le ou quant à lui est beaucoup plus permissif si un seul des deux Boulen est vrai le résultat sera vrai si par contre les deux sont faux le résultat sera faux ainsi le caractère pour faire un ou en s'écharpe est le pipe la barre droite qui s'obtient en faisant un Alt Gr et la touche 6 de votre clavier sur les claviers français finalement vient le ou exclusif qui n'autorise que un seul des deux Boulin à être vrai si les deux sont vrais ou les deux sont faux la logique sera fausse en Schar pour faire un OU exclusif on utilisera l'accent circonflexe entre les deux variables vous utiliserez majoritairement les les opérateurs e et ou et très rarement voir quasiment jamais le ou exclusif voici les exemples de code de comment faire les opérateurs en carp à côté du e on a le E qui est vrai avec deux variables trou et le E qui est faux avec une des deux variables qui est égale à false avec le ou nous avons une des deux variables qui est vraie qui provoque le résultat trou et si les deux sont falses nous avons le résultat false et finalement avec le ou exclusif il faut que une des deux valeurs seulement soit vraie pour que la valeur soit vraie on notera que les opérateurs symbolisés par le E commercial et par le pipe seul vont impliquer une particularité c'est-à-dire que chacune des valeurs sera testée si on revient en arrière on voit que dans le cas du e dès lors que une valeur est false le résultat sera forcément false c'est-à-dire que si on teste de boules et un et que le premier est false l'intérêt de tester le second est nul et c'est pareil pour le pour le pour le ou si le premier Boulin est trou peu importe la valeur du second le résultat sera forcément trou ainsi pour gagner en performance et être un peu plus précis on peut doubler l'opérateur donc au lieu d'avoir un e ou un un pipe seul on va avoir un double e ou un double pipe et comme ça dès lors que une des conditions permet de savoir de d'anticiper le résultat total de l'opération et bien on n'exécutera pas les autres on ne fera pas la vérification des autres boulins qui suivent par exemple si j'ai ici vrai et faux et bien si j'écris est-ce que faux est égal à trou et est-ce que vrai est égal à trou le premier test faux est égal à trou va me renvoyer false donc en utilisant une seule fois le E ici dans le cas du code qui était écrit les deux tests seront effectués c'est-à-dire que même si faux est égal à trou en verra faux on ira quand même tester est-ce que vrai est égal à trou ce qui n'apporte pas d'intérêt parce qu'on sait dès le début que de toute façon avec le E dès lors qu'on rencontre un seul FSE le résultat n'a pas besoin d'être exécuté si par contre on décide de doubler les l'opérateur et bien dans ce cas le la condition du if va être exécutée plus rapidement parce qu'on aura pas besoin de tester les autres conditions est-ce que faux est égal à trou non donc de toute façon le résultat sera false parce que on veut faire un e donc je peux de suite passer dans le else si else il y a de d'une façon générale il est recommandé de toujours utiliser le double opérateur afin d'éviter de mauvaises surprise et surtout de gagner en performance afin que vous puissiez maîtriser cela je vous propose un petit exercice cet exercice est différent des précédents parce que ça va être le début de l'implémentation de votre premier projet totalement exécutable qui sera un jeu ce jeu c'est le nombre mystère pour faire simple vous allez donner votre application à un joueur et le but de ce joueur va être de deviner le nombre caché en saisissant une valeur par exemple dans votre jeu nombre mystère vous avez défini la valeur comme étant égale à 7 ensuite vous affichez à l'écran au joueur vous lui dites essayez de deviner le nombre entre 1 et 10 et le joueur va donc saisir par exemple 5 et vous devez comparer la saisie du joueur par rapport au nombre mystère si le nombre mystère a été découvert le joueur a gagné sinon il a perdu nous allons mettre en place les toutes premières briques de l'implémentation de ce jeu il s'agit de la logique initiale afin de ne pas être parasité par autre chose je vous conseille de créer un nouveau projet dédié nombre mystères que nous allons le faire évoluer au fur et à mesure des différentes vidéos et car nous n'avons pas encore vu comment générer un nombre mystère de façon aléatoire pour le moment la valeur du nombre mystère sera définie en tant que constante nous allons demander donc à l'utilisateur de deviner le nombre mystère et on va vérifier la valeur qu'il aura saisie grâce à l'opérateur super ou égal ou infér ou égal selon votre choix et et nous allons afficher pour le moment une simple indication avant de terminer le programme est-ce que le nombre est plus grand et au quel cas lui dire le nombre mystère est plus grand vous avez perdu est-ce que le nombre mystère est plus petit on va également lu indiquer lui dire qu'il a perdu et si il a trouvé le bon nombre on va lui dire qu'il a gagné en bonus si cela vous semble trop simple on peut également commencer à rajouter certaines choses comme par exemple la demande du prénom du joueur on va le stocker dans une variable et sera cela nous sera utile pour la suite de l'exercice je vous invite donc à mettre la vidéo en pause à essayer de créer cet exercice de réaliser cet algorithme et je vous donne rendez-vous dans quelques secondes pour le corriger pour cet exercice il nous était demandé de créer la toute première version du projet nombre mystère j'ai donc ici créé un nouveau dossier et un nouveau projet nombre mystère dans lequel nous nous allons réaliser l'implémentation de cet exercice com on peut le voir je n'ai rien fait et somme toute le déroulé de cet exercice est très simple nous allons demander à la personne de saisir un nombre entre 1 et 10 et comparer ce nombre avec le nombre mystère défin précédemment bien entendu pour que ce soit un vrai jeu il nous faudrait introduire la notion d'aléatoire mais il est encore un petit peu tôt dans ce cours pour ce fonctionnement là donc ce qu'on va faire c'est que au lieu d'introduire le nombre mystère de façon aléatoire je vais en définir une constante que je vais appeler nB mystère qui va être égale à une valeur fixe moi je mets 7 qui est donc compris entre 1 et 10 mettez le nombre que vous souhaitez bien entendu au niveau du jeu cela rend le jeu très peu rejouable une fois qu'on a trouvé le nombre mystère on sait que c'est celui-là de façon définitive mais plus tard nous allons améliorer cette application donc il va falloir dire à l'utilisateur ce qu'on attend de lui on va donc écrire sur la console saisir un nombre entre 1 et 10 comme on l'a vu dans les vidéos précédentes quand on va lire le résultat de ce qui a été saisi sur la console nous allons récupérer une chaîne de caractère or notre nombre mystère est bien un numérique de type entier il va donc falloir comparer la saisie de l'utilisateur avec le nombre mystère il va donc nous falloir ici le nombre qui va être le parce de ce qui a été écrit sur la console comme on l'a vu dans les vidéos précédentes si la personne ne saisit pas un nombre entre 1 et 10 et saisi quelque chose soit qui dépasse 10 soit qui est infire à 1 voire même quelque chose qui n'est pas transformable en entier nous allons avoir une erreur et comme je l'ai dit vu qu'ici c'est la toute première version nous allons l'améliorer dans les vidéos qui viennent au fur à mesure de l'apprentissage de nos connaissances maintenant il va falloir faire un test et appliquer une comparaison entre le nombre saisi par la personne et le nombre mystère on va commencer par le cas le plus simple la personne a deviné le nombre mystère c'est-à-dire que le nombre qu'il a saisi sur la console est strictement égal au nombre mystère on va donc faire un IF nombre à savoir le nombre qu'il a saisi est égal à nombre mystère dans ce cas-là ça veut dire que la personne a gagné la partie étant donné qu'elle a bien trouvé le nombre donc on va écire sur la console comme quoi la personne a gagné et qu'elle a trouvé le nombre mystère dans le cas inverse il va falloir lui donner une indication alors ici nous n'avons pas mis en place de rejouabilité c'est-à-dire que si la personne se trompe elle aura l'indication comme quoi le nombre mystère est plus petit ou plus grand c'est ce qu'on va faire juste maintenant mais elle ne pourra pas avoir une autre tentative le jeu va s'arrêter là bien sûr on va améliorer ce fonctionnement pour que avec l'indication la personne puisse rejouer mais pour l'instant on va simplement donner une indication qui va être est-ce que le nombre mystère est plus petit ou est-il plus grand pour cela il va falloir comparer le nombre avec le nombre mystère sur un plan par le biais des opérateurs supérieurs ou inférieurs par exemple si le nombre saisi est supérieur au nombre mystère ça veut tout simplement dire que on a saisi un nombre qui est trop grand comme 8 ou 9 et donc dans ce cas-là on va écrire sur la console que le nombre mystère est plus petit inversement et ici nous n'avons pas besoin de cumuler un autre if parce que soit il est supérieur soit il est inférieur étant donné que l'égalité a été testée précédemment dans ce cas-là le nombre mère est plus grand donc si la personne a saisi 1 2 3 4 5 ou 6 et à partir de là notre not re jeu est donc fonctionnel la personne va saisir un nombre et on va le comparer avec le nombre mystère on va tester ceci sans plus attendre donc on doit saisir un nombre entre 1 et 10 saisissons d'abord le nombre 5 nous avons le nombre mystère est plus grand et comme je l'ai dit on ne peut pas rejouer on doit donc relancer l'application mais armé de cette nouvelle information on sait maintenant que le nombre est plus grand que 5 si on va donc saisir 8 et là nous avons le nombre mystère est plus petit ce qui veut dire que le nombre mystère est compris entre 5 et 8 et donc si je relance l'application pour jouer une dernière fois et que je fais 7 félicitations vous avez gagné et trouvé le nombre mystère alors bien entendu ici j'ai joué de façon un peu bête étant donné que j'avais déjà le résultat mais ça m'a permis de tester chacun des embranchements que je voulais mettre en place comme vous le voyez l'application de conditions avec des IF des l imbriqué et ainsi de suite n'est en soi pas très compliqué et on pourrait très bien cumuler les différents tests comme on le fera plus tard au cours de cette formation si vous avez réussi cet exercice félicitations vous avez donc codé votre petit jeu nombre mystère où est-ce que vous avez fait l'application des différents opérateurs arithmétiques entre les nombres entiers pour produire des bouléins et avoir des embranchements de code qui respectent une structure logique permettant de mettre en place un algorithme de jeu si vous n'avez pas réussi n'hésitez pas à revoir cette vidéo ainsi que la vidéo précédente pour être certain de bien comprendre le fonctionnement des IF des else et également des opérateurs arithmétiques qui vont donc produire des Boulin avant d'aller plus loin dans ce cours car c'est quelque chose qui va revenir de façon récurrente nous allons maintenant étudier un point important de la programmation en c#arp à savoir les collections une Collection est un ensemble de valeur réunie ensemble au sein justement d'une collection qui permet de travailler avec tout un ensemble au lieu de travailler avec une valeur unitaire il existe un grand nombre de collections disponibles en c#arp nous allons bien sûr pas pouvoir toutes les couvrir ni dans cette vidéo ni dans ce cours mais nous allons quand même étudier les principales et celle que vous allez le plus utiliser la première collection qu'on va étudier est probablement la plus simple mais également la moins permissive c'est le tableau un tableau est un ensemble qui est défini d'avance c'est-à-dire qu'on connaît sa taille au moment est-ce qu'on va le créer c'est un ensemble d'éléments du même type et étant donné que le langage c#arp est un langage fortement typé quand on va créer un tableau d'un type donné on ne pourra pas y insérer d'éléments d'un autre type prenons un exemple si j'ai un tableau de chîn de caractère je ne vais pas pouvoir stocker dans ce tableau au milieu des chaînes de caractères un entier je serai obligé de convertir cet entier en chaîne de caractère et inversement si j'ai un tableau d'entier je ne pourrais pas y stocker une chaîne de caractère la syntaxe pour déclarer un tableau est d'utiliser les crochets comme ici à l'écran en bas ouvrant et fermant après le type c'est-à-dire que au lieu de déclarer par exemple string ma variable je tape je vais écrire string crochet ouvrant crochet fermant ma variable comme ceci on remarquera également qu'il y a certains mots qu'on n pas encore vu et que la syntaxe est un petit peu particulière c'est pourquoi je vous propose de la disséquer tout de suite afin d'éliminer tout malentendu voici la déclaration du tableau telle qu'elle était définie dans la slide précédent string crochet ouvrant crochet fermant tableau de string est égal à New string crochet ouvrant 10 crochet et ferment on voit bien ici le type d'élément dans le tableau c'est le type de la variable qui se trouve avant les crochet ainsi j'ai fait ici un tableau de chîne de caractère parce que j'ai écrit string suivi des crochets si j'avais écrit int suivi des crochets j'aurais eu un tableau d'entier et ce pareil avec n'importe quel type qui existe en c#arp les doubles crochets sont vides pour la déclaration du type c'est très important et ils sont bien accrochés au type et non pas au nom de la variable comme ça pourrait être le cas dans d'autres langages comme le C par exemple ensuite nous utilisons ici un nouveau motcé que nous n'avons pas encore vu jusqu'à présent qui est le mot clés new qui veut dire nouveau en français ce mot-cés permet de créer le tableau en mémoire nous reviendrons en détail sur le New quand nous verrons la programmation orientée objet finalement lorsque on déclare le tableau après le motcé New il faut dans les crochets cette fois-ci insérer la taille du tableau pour déclarer qu'on souhaite un tableau d'une taille donnée donc imprégnez-vous bien de cette syntaxe pour être sûr de bien la comprendre lorsqu'on déclare le type et le nom de la variable les crochets sont vides et lorsqu'on va affecter le tableau pour réserver un espace en mémoire donc affecter une valeur après le égal on commence par le motcé New on reprend le type d'élément dans le tableau et cette fois-ci entre crochet on met la taille de notre tableau comme on vient de le voir un tableau doit être déclaré avec une taille initiale l'avantage de cette approche à savoir déclarer avec une taille donnée est qu'on est très précis sur la mémoire que l'on va occuper c'est-à-dire qu'on sait exactement que dans ce tableau il y aura 10 éléments et pas un de plus l'inconvénient c'est que le tableau une fois qu'il a été décrit et qu'il a été déclaré avec une taille donnée il n'est pas facilement redimensionnable attention ça ne veut pas dire qu'il n'est pas redimensionnable je dis juste qu'il n'est pas facilement redimensionnable c'est-à-dire qu'on ne peut pas dire et ben finalement je voulais 15 éléments donc j'ai juste à faire égal new tableau de 15 si je fais ça je vais réaffecter mon tableau et supprimer tout ce qui était déjà rangé dans le précédent donc le redimensionnement est une opération qui est un peu plus avancée que ce qu'on a vu jusqu'à présent mais néanmoins pas impossible pour accéder à un élément particulier d'un tableau que ce soit en lecture comme en écriture on va utiliser ce qu'on appelle un index cet index c'est un entier qui ira de 0 à la taille du tableau 1 si je reprends mon exemple précédent avec mon tableau qui a 10 éléments parce qu'on a déclaré un nouveau tableau de 10 j'ai les indexes de 0 à 9 à ma portée afin d'accéder au 10 éléments du tableau l'index 0 est à pour la première position du tableau ça peut sembler un peu contreintuitif au début mais c'est quelque chose avec lequel il faut s'habituer ainsi sur un tableau de 10 éléments je ne pourrai pas accéder à index 10 parce qu'il fait référence au 11e élément du tableau si je tente de faire ça je vais avoir une erreur pour accéder à un élément d'un tableau par rapport à son index on placera l'index entre crochets et cette fois-ci après le nom de la variable par exemple si je reprends le tableau que j'avais créé précédemment qui était un tableau de 10 chaînes de caractères je vais pouvoir affecter à la première place du tableau c'est-à-dire à l'index Z0 la valeur totoau en écrivant le nom de ma variable crochet ouvrant 0 crochet fermant est égal à la valeur on le voit ici à l'écran et cet accessour par index est également possible afin de pouvoir lire la valeur qui se trouve à cet endroit là de mon tableau donc ici en deuxème ligne si je stock dans une variable résultat j'ai exactement la même écriture sauf que l'accès par index se trouve à droite de l'affectation et non pas à gauche l'index me permet donc d'accéder à un élément en lecture comme en écriture il est également possible de définir les valeurs initiales d'un tableau en utilisant une syntaxe un petit peu particulière avec le niveau de connaissance qu'on avait juste avant on aurait pu croire qu'il était obligatoire de passer sur chacun des éléments du tableau par son index pour affecter une valeur cela peut se faire dès l'affectation de la variable en utilisant la syntaxe suivante on reprend la même syntaxe pour déclarer un tableau que ce qu'on a fait jusqu'à présent à savoir le type suivi de crochet suivi du nom est égal à New le type suivi de crochet avec la taille X dans le cas présent et juste après au lieu de mettre un point virgule nous ouvrons les accolades et nous saisissons la totalité des valeurs que doit contenir le tableau attention c'est important de saisir la totalité des valeurs car si on ne saisit que une partie des valeurs le compilateur ne sera pas content parce que qui ça ne satisfera pas la l'initialisation totale du tableau donc il est nécessaire de saisir les X valeurs du tableau remarquez ici que j'ai mis valeur 1 2 à X parce que le tableau fait x éléments ainsi si je reprends par exemple un un autre exemple ici j'ai un tableau d'entier qui s'appelle de 1 à 5 il s'agit d'un nouveau tableau de 5 entiers qui contiennent les valeurs 1 2 3 4 et 5 ainsi il est possible de créer un un tableau qui soit vide en admettant les valeurs entracolad où il est également possible de préciser les valeurs initiales en les spécifiant toutes entracolade après la déclaration du tableau avec sa taille et le moclu dans la vidéo précédente nous avons étudié le tableau et la plus grande force de cette collection est qu'il possède une faible empreinte mémoire c'est-à-dire que étant donné que nous sommes très précis sur la taille qu'il doit tenir en mémoire nous ne prenons pas plus de mémoire dans l'ordinateur que nécessaire il possède cependant une faiblesse indéniable comme je l'ai dit c'est qu'il est difficile de gérer sa taille facilement les deux façons d'augmenter la taille d'un tableau sont pour la première assez coûteuse car il s'agit de créer un nouveau tableau de la taille désirée et de copier élément par élément les éléments du tableau original vers le tableau de destination la seconde est d'utiliser une méthode disponible dans le framework dont la syntaxe est beaucoup trop complexe pour être étudié maintenant heureusement le Framework.NET nous offre un autre type de collection la liste de façon sous-jacente il faut savoir que la liste elle-même utilise un tableau dans sa façon de fonctionner mais contrairement au tableau la liste nous offre des méthodes et des fonctionnalités beaucoup plus avancées et surtout beaucoup plus aisé pour gérer notamment la taille et le nombre d'éléments pour créer une liste il faut écrire le code suivant liste chevron ouvrant le type chevron fermant le nom de la variable est égal à New liste chevron ouvrant le type chevron fermant parenthèse ouvrante parenthèse fermante la syntaxe ici est très particulière et peut même paraître un petit peu déroutante notamment car elle fait appel à deux notions qu'on n pas encore étudié à savoir la construction d'objet et les types génériques nous verrons ces notions en détail plus tard et vous comprendrez beaucoup mieux l'écriture qui est ici affichée à l'écran pour le moment contentez-vous simplement de la prendre par cœur afin de pouvoir la réutiliser avant de vraiment la comprendre imaginons maintenant que je souhaite créer une liste de chaînes de caractères en suivant cette syn taxe je vais remplacer type par le type d'élément que je veux que ma liste contienne ainsi pour créer une liste de chaîne de caractère j'aurai la déclaration suivante list entre chevron string chîn est égal à new list entre chevron string parenthèse ouvrante et fermante pointvule une fois cela fait j'ai à ma disposition une liste sur laquelle je vais pouvoir travailler la la liste est un objet c'est-à-dire qu'ici nous avons une instance d'un obj avec lequel nous pouvons travailler on va donc pouvoir utiliser des méthodes dessus et exploiter ces données mais avant ça prenons le temps de dissquer rapidement cette instruction pour être sûr que vous la mémorisez bien nous avons le type d'élément dans la liste qui se trouve entre chevron à la déclaration les chevrons sont obligatoire pour encadrer le type donc vous allez taper liste etpil les chevrons et le type on réutilise de nouveau le motcé New pour créer la liste en mémoire exactement comme ce qu'on a fait pour les tableaux on reprend le type complet après le mot cl new on remarquera ici qu'il n'y a pas besoin de passer de taille et il faut passer les doubles parenthèses comme l'appel d'une fonction sans paramètres c'est un petit peu particulier mais pour le moment contentez-vous comme je l'ai dit d'être certain de comprendre cet appel par cœur avant de comprendre tout ce qu'il y a dedans la liste off notamment une fonction qui permet de facilement ajouter un élément il s'agit de la fonction ad on a déjà appelé des fonctions sur des objets et bien maintenant que nous avons une variable de type liste on est en capacité d'appeler la fonction add sur cette liste ainsi en reprenant notre variable Chan on peut faire Chan point et là nous aurons la liste des éléments disponibles sur la liste de Chan et ensuite nous pouvons mettre add et lui passer entre parenthèses la valeur que l'on souhaite ajouter dans la liste à noter ici que le point ad prendra en paramètre au niveau entre ces parenthèses une valeur du type qui a été décrit entre chevron précédemment c'est-à-dire que si au lieu d'avoir fait une liste de chaînes de caractères vous avez fait une liste d'entier avec une liste de int le point ad qui est ici affiché à l'écran ne sera pas une chaîne de caractère mais bien un entier c'est là toute la force de la liste par rapport à d'autres types c'est qu'en faisant un point ad on va directement avoir la méthode ad qui va contenir le type qui a été décrit lorsqu'on a lorsqu'on a écrit la déclaration de variable de notre liste la liste peut également s'utiliser comme un tableau à l'aide d'index parce que comme je l'ai dit précédemment étant donné qu'elle utilise de façon sous-jacente un tableau il y a juste à rediriger l'index vers le tableau sous-jacent donc on peut utiliser la liste en mettant le chire dans les crochets après le nom de la variable ça fonctionne de la même façon par exemple le en reprenant encore une fois la liste de chaînes dans laquelle j'ai ajouté une valeur unique au début de ma liste ici si je crée une valeur qui s'appelle valeur liste qui est égale à chîn à l'index z0ro je prendrai le tout premier élément de ma liste parce que je peux y accéder par index on verra ultérieurement d'autres façons d'aller récupérer des éléments dans une collection comme une liste attention tout comme le tableau si vous tentez d'accéder à un index invalide votre programme plantera par exemple ici dans ma liste je n'ai ajouté qu'une seule valeur c'est-à-dire que je n'ai qu'une valeur accessible à l'index 0 si je tente d'aller récupérer une valeur à l'index 10 par exemple et bien cet index n'étant pas affecté je j'aurai une erreur un petit peu comme tout à l'heure si je tentais d'accéder au 11e élément de mon tableau de 10 éléments nous allons étudier un concept très important en programmation et en algorithmique ce sont les boucles il va arriver plusieurs fois durant votre code qu'il soit nécessaire de répéter une action soit un certain nombre de fois soit selon d'autres conditions on va prendre un exemple très simple la version actuelle de notre jeu la partie s'arrête dès que l'utilisateur a fait un essai que cet essai soit infructueux qu'il est donc perdu ou qu'il est gagné dans tous les cas la partie s'arrête ça semble logique que la partie s'arrête effectivement quand l'utilisateur gagne la partie mais c'est quand même très frustrant que la partie s'arrête au premier échec ce qu'on va vouloir faire c'est donner plusieurs chances au joueurs de deviner le nombre mystère et pour ça on va utiliser une boucle c'est-à-dire qu'on va répéter le traitement jusqu'à ce que une condition il existe en cchar plusieurs type de boucle on peut créer une boucle notamment qui s'arrête sur la base d'une condition je vais faire cette action tant que tel condition n'est pas atteinte on peut également définir une boucle qui est définie un certain nombre de tours définis d'avance par exemple je vais faire cette action 10 fois et pas une de plus ni une de moins et finalement on aura une boucle qui va nous permettre de parcourir de façon exhaustive toutes les valeurs d'une collection on a vu deux collections qui sont le tableau et la liste on peut très bien dire pour chaque élément de cette collection je veux faire telle action donc comme on le voit on a trois types de boucles et les vidéos qui vont suivre vont nous permettre de les étudier en détail la boucle fort est une boucle qui prend trois éléments en considération tout d'abord on aura un état de départ dans quel état on veut faire en sorte que la boucle démarre c'est son postulat son état initial nous définirons ensuite la condition de sortie à partir de quand la boucle s'arrête et finalement on va définir une fonction qui va s'exécuter à chaque fois qu'on fait un tour la boucle fort est très utilisée dans sa forme la plus simple permettant de faire un nombre de tours définis d'avance donc la syntaxe est la suivante on aura le mot clé fort suivi entre parenthèses de l'état de départ la condition de sortie et la fonction et en tracolade on définira le tour de boucle j'ai mis la syntaxe je vous propose qu'on aille à la slide suivante pour décortiquer une boucle fort en code mais avant ça comme dans le if on va mettre entre acolade ici le code à effectuer entre chaque tour de boucle reprenons voici une boucle fort écrite dans Visual Studio code on voit une coloration un peu particulière et on voit les blocs distinct on va disséquer ça étape par étape tout d'abord pour rappel une boucle va définir un bloc de code qui va être répété autant de fois que la boucle va s'exécuter c'est-à-dire qu'ici la boucle fort qui a été écrite je vais vous dire directement qu'elle fait 10 tours mais il faut comprendre que le bloc défini entre les accolades qui suit la boucle fort va donc être exécuté 10 fois et cela est valide pour toutes les boucles que nous allons voir on définit donc un bloc qui suit la déclaration de la boucle pour exécuter le code tant que la boucle n'est pas sortie et n'a pas fini son exécution le mot mot clé fort est défini en début d'instruction c'est lui qui détermine qu'on va faire une boucle fort ensuite nous avons ici l'état de départ dans le cas des boucles fort c'est très classique d'avoir ce fonctionnement là ici l'état de départ est de définir un Antier qui s'appelle I qui est égal à la valeur 0 je peux mettre absolument ce que je veux en état de départ mais généralement étant donné qu'on se sert de la boucle fort pour faire un nombre défini de tours on va définir une variable de type entier qui nous servira de compteur et qui aura une valeur initiale on remarquera que la séparation entre l'état de départ et la condition de sortie se fait par un point virgule ce qui peut être un petit peu perturbant parce qu'on a vu jusqu'à présent que le pointvgule était utilisé en fin d'instruction la boucle fort est très particulière dans sa syntaxe parce qu'elle va séparer par un pointvgule les trois blocs qui constituent les trois éléments de de la boucle fort donc l'état de départ la condition de sortie et la fonction à chaque tour on peut même considérer que chacun de ces blocsl est une instruction s'écharpe à part entière d'où on mettra un pointvgule suite à cela on aura la condition de sortie ici tant que I n'est pas supérieur ou égal à 10 la boucle continuera à s'exécuter donc ma condition de sortie elle sera validée à chaque tour de boucle et tant qu'elle renverra vrai je continuerai à tourner dès lors que cette condition renra false j'arrêterai de faire mes tours de boucles donc la condition de sortie à mettre ici est bien un test logique qui renvoie vrai tant que vous voulez tourner et qui renverra faux quand vous ne voulez plus que la boucle s'exécute d'où ici je veux que ma boucle force s'exécute tant que I est inférieur à 10 encore une fois séparation par un point virgule entre la condition de sortie et la fonction à chaque à chaque tour ici la fonction à chaque tour de boucle sera une fonction qui est est propre à la boucle fort et qui n'impacte pas le bloc à l'intérieur on pourrait très bien déplacer ce i++ à l'intérieur de la boucle fort et omettre cette dernière partie parce que la boucle fort permet de définir des blocs vdes que ce soit pour l'état de départ la condition de sortie ou la fonction à chaque tour néanmoins il est recommandé de déclarer dans la boucle fort tout ce qui a trait au fonctionnement de la boucle d'où la dernière instruction qui est une fonction à faire à chaque tour de Bou qui n'impacte que le compteur il n'est pas recommandé de mettre à la fin de la boucle fort l'intégralité de ce qu'on aurait mis dans le bloc qui suit la boucle fort donc ici on voit d'ailleurs quelque chose d'un petit peu particulière on voit i suivi de de plus le i++ est une représentation très classique de ce qu'on appelle la post incrémentation cela veut dire que la valeur qui est stockée dans I sera incrémentée de 1 à chaque fois qu'on appellera I i ++ c'est totalement équivalent à écrire I est égal à i + 1 sauf que c'est beaucoup plus condensé d'écrire i++ voilà la syntaxe de la boucle fort je vous invite à bien assimiler la façon dont elle est écrite car nous allons passer à un petit exercice le but de cet exercice est de demander à un utilisateur de saisir trois éléments sur la console et après d'afficher chacun des éléments sur chaque ligne on fera pour ça une application dédiée où on peut reprendre une autre application et mettre en commentair tout ce qu'on a déjà fait pour éviter de multiplier les projets c'est à vous de voir ce que vous préférez on utilisera un tableau pour stocker les nombres pourquoi un tableau simplement parce qu'on a déjà ici le nombre d'éléments que l'on souhaite stocker à savoir trois donc il n'y a pas forcément d'intérêt à aller créer une liste qui va gérer dynamiquement un redimensionnement de taille on utilisera la boucle fort pour afficher les éléments donc si vous avez besoin remettez la vidéo un peu en arrière pour avoir l'exemple de la boucle fort afin de vous en servir dans l'exercice je vous donne un petit indice pour la résolution de cet exercice l'index grâce auquel vous allez pouvoir accéder à un élément du tableau se trouve directement dans la déclaration de la boucle et va changer à chaque tour ce qui veut dire que pour stocker les choses vous allez voir les mettre directement grâce à l'index et à la valeur du compteur de la boucle fort au niveau du tableau je vous laisse donc mettre la vidéo en pause et essayer de faire cet exercice par vous-même je vous donne rendez-vous dans quelques secondes pour le corriger le but de cet exercice était de nous faire pratiquer la boucle fort j'ai donc créer pour l'occasion un nouveau projet dans un nouveau dossier qui s'appelle exercice fort qui qui va nous permettre de pratiquer en toute quiétude la boucle fort il était demandé la saisie de trois valeurs sur la console pour les ranger dans un tableau et ensuite de parcourir ce tableau afin de pouvoir récupérer les différentes valeurs bien entendu il est tout à fait possible de réaliser ce petit et simple exercice sans la boucle fort mais tout le principe est justement de la pratiquer donc nous allons l'utiliser deux fois la première fois pour remplir le tableau la seconde fois pour lire le tableau la première chose qu'on va faire c'est qu'on va déclarer un tableau de chaîn de caractère bien qu'effectivement dans le slide j'avais parlé de nombre il sera plus simple ici de mettre des chaînes de caractères si vous avez fait l'effort de mettre des nombres avec int pointpse et un tableau de int par d'inquiétude ça marche aussi le but de l'exercice n'était pas de pratiquer les différents types de tableau mais bien de pratiquer la boucle fort donc ici je vais l'appeler valeur et je vais donc créer un nouveau tableau de trois chaînes de car caractère je vais donc écrire ici une boucle fort et comme vous remarquez si je descends d'un cran on retrouve en fait l'icône de snipet cette icôneci qui indique en fait qu'on a ce code-ci qu'on voit dans la fobule à gauche qui va automatiquement être généré par Visual Studio code pour nous si j'appuie sur Entrer et comme vous le voyez ça nous fait gagner beaucoup de temps je vous invite à utiliser les snipets quand vous êtes totalement sûr de comprendre le fonctionnement de la boucle fort et ce pour n'importe quel type de code que vous voulez générer automatiquement pour éviter d'avoir trop à compter sur l'outil et ne pas savoir la syntaxe sans y être habitué je voulais simplement vous montrer qu'il y avait effectivement ce snipet pour faire gagner du temps mais nous allons le faire à la main dans un but pédagogique car ici tout le but est justement de pratiquer la boucle fort donc la boucle fort est assez simple dans le sens où elle se comporte comme un IF c'est-à-dire qu'on va avoir le mot clé de la boucle et ensuite les parenthèses qui vont définir son comportement elle a une syntaxe qui est très particulière et très peu commune car en effet elle contient au sein des parenthèses trois instructions différentes la première est l'initialisation donc ici par exemple on va déclarer que on a un compteur qui est de type in qui s'appelle I qui est égal à é0 et ensuite on va utiliser le Point Virgule et c'est quasiment un des seuls usages où est-ce que le pointvgule ne se trouve pas à la fin d'une ligne c'est dans la boucle fort étant donné qu'ici on va avoir trois instructions nous allons donc ensuite définir la condition d'arrêt i inférieur à 3 et ensuite on va définir ce qui se passe à chaque tour de boucle donc i ++ est un raccourci pour dire I est égal à i + 1 en fait vous voyez que si j'écris i = à i + 1 j'ai trois petits points sous le égal et visual sudocode me propose d'utiliser l'opérateur Plus+ et donc si je fais quick fix que je choisis la solution je peux voir que j'ai donc i ++ qui est un raccourci d'écriture qui qui fait exactement la même chose ceci est donc la boucle fort telle qu'on l'a appris et comme je vous l'ai montré juste avant si vous voulez gagner du temps par la suite n'hésitez pas à utiliser le snipet ce qu'on va faire c'est qu'on va donc demander à la personne de saisir une valeur nous allons donc récupérer la valeur qui a été saisie sur la console en tant que chaî de caractère pour la stocker dans notre tableau on va donc utiliser l'accesseur par index de notre tableau et ici nous allons stocker à l'index représenté par la variable du compteur n'oubliez pas qu'un tableau commence à 0 c'est-à-dire qu'un tableau de trois éléments contient l'index 0 1 et 2 et ça tombe bien c'est exactement ce que notre boucle fort va faire pour nous on va avoir i = 0 i = 1 et I = 2 et puis quand i va passer à 3 vu qu'on va ne plus respecter la condition de sortie on va arrêter la boucle fort donc ici valeur de I est égale à console point readline pour stocker ce qui a été saisi dans la console à l'index i de notre tableau ainsi nous avons utiliser une boucle pour inviter l'utilisateur à saisir un ensemble de trois valeurs on pourrait également lui spécifier la valeur qu'on attend la valeur numéro et ici on pourrait ajouter l'index i la problématique avec cette approche c'est qu'on aura saisir la valeur numéro suivie de l'index i mais I est un index algorithmique et non pas un index humain si je puis dire dans le sens où pour nous en tant qu'être humain quand on prend un tableau ou une collection d'éléments on va commencer à compter à 1 et non pas à é0 0 est utile pour l'algorithme mais quand on va dire à quelqu'un prends-moi le premier élément de ce tableau ou prends-moi le premier élément quiil y a dans cette boîte on va prendre l'élément qui se trouve en première position si je dis à quelqu'un prends-moi l'élément qui se trouve à la position zéro ça n'a pas de sens dans la vie réelle donc ici nous allons faire i + 1 afin d'avoir quelque chose de logique donc on va avoir saisir la valeur numéro 1 numéro 2 numéro 3 il faut être donc vigilant entre ce décalage du compteur pour les humains et pour l'algorithme une fois que ceci est fait nous allons refaire une autre boucle for avec le snipet cette fois-ci et donc ici on va bien spécifier 3 et on va écrire sur la console à l'aide de l'interpolation la valeur à l'index I et la valeur donc ici c'est assez simple pour récupérer la valeur on va faire exactement pareil que ce qu'on a fait pour l'affectation on va utiliser l'indexeur par crochet donc l'indexeur par crochet est valide aussi en écriture qu'en lecture pas de problème pour ça et donc ici il faut ne pas retomber dans le piège et bien incrémenter i de 1 pour avoir un index humain on a donc dans ce programme deux boucles for la première pour la saisie la second pour la lecture lançons notre application pour voir ce qu'il en est donc la valeur numéro 1 la valeur numéro 2 et la valeur numéro 3 une fois que tout a été saisi on peut voir ici que la seconde boucle fort va parcourir mon tableau et restituer les valeurs que j'ai donc saisies juste précédemment et ce de façon automatisée en effet je n'ai pas eu besoin de faire manuellement le traitement pour définir l'index 0 l'index 1 l'index 2 et ainsi de suite j'utilise une boule pour répéter un algorithme un morceau de code X fois et comme on peut le voir on peut se servir des valeurs du compteur de la boucle fort afin de profiter au maximum de cette boucle pour faire du code dynamique en fonction de chaque itération si vous avez réussi cet exercice que ce soit avec des chaînes de caractère ou avec des nombres félicitations vous savez maintenant comment utiliser la boucle fort si vous n'avez pas réussi je vous invite à revoir cette vidéo la boucle force s'avère bien utile pour parcourir des collections comme des tableaux ou divers éléments où est-ce que l'index joue un rôle prépondérant il serait dommage de ne pas connaître cette boucle qui pourra être utile dans bien des situations le deuxième type de boucle que nous allons étudier est la boucle while en anglais while peut se traduire en français comme tant que c'est-à-dire que la boucle while est une boucle qui va prendre en considération une condition pour s'exécuter cela signifie tout simplement que tant que cette condition ne reverra pas false la boucle fera dé tour sans s'arrêter il est donc assez important de s'assurer que la condition évolue au fur et à mesure des tours de bouces la syntaxe est plus simple que la boucle fort et est la suivante nous allons écrire le mot-cé while et en parenthèse nous allons avoir une condition à l'instar de la boucle for ou du if on mettra entre àolade le code à effectuer entre chaque tour de boucle attention cependant petit avertissement le compilateur ne vous préviendra pas si votre boucle est infinie d'une part parce que ce sont des cas d'usage qui peuvent exister et d'autre part parce qu'il n'a peut-être pas la possibilité d'avoir cette information ainsi il est tout à fait possible d'écrire while et entre parenthèses m directement la valeur Boulen TR ce qui fait de fait une boucle infinie qui ne s'arrêtera jamais il n'y aura aucun warning ni aucune heure de compilation à cela voici la boucle while écrite dans Visual Studio code nous voyons ici par exemple une variable int entier qui est égale à Z0 et une condition notre boucle wi tant que entre parenthèses l'entier est inférieur à 10 pour s'assurer que cette boucle ne soit pas infinie dans le bloc de code associé à notre boucle nous écrivons anti Plus+ qui suit la même syntaxe que ce qu'on a vu précédemment à savoir la post incrémentation qui va donc incrémenter la valeur entier de 1 à chaque tour de boucles reprenons cette instruction en détail le code qui est entre les deux accolades sera exécuté tant que la condition ne sera pas égale à false c'est-à-dire tant que l'entier ne sera pas supérieur ou égale à 10 cette condition sera évaluée à chaque tour de boucle vous n'avez rien à faire c'est automatiquement géré par ccharpe la seule chose qu'il faut vous assurer c'est que cette condition puisse être atteinte dans le cas où vous souhaitez que la boucle se termine et de la même façon il vous faut définir dans le bloc qui suit la boucle wi des éléments ou du code qui permet de faire en sorte que la condition qui est réévaluée puisse changer et passer de trous à false pour que cela soit plus clair je vous propose de passer un petit exercice le but de cet exercice va être d'améliorer notre jeu du nombre mystère jusqu'à présent comme on l'a vu le joueur n'a qu'une seule tentative et va devoir relancer l'application nous allons transformer le jeu pour que le joueur puisse jouer jusqu'à ce qu'il ait gagné à cet effet nous allons utiliser la boucle while qui va faire que le joueur va pouvoir continuer à essayer de deviner le nombre mystère jusqu'à ce qu'il n'est pas gagné on va considérer que la seule façon de sortir du jeu pour le moment est de gagner le jeu je vous laisse donc réfléchir à comment répondre à ce problème et comment résoudre cet exercice et je vous donne rendez-vous dans quelques secondes pour le corriger dans Visual Studio code j'ai repris ici le code source de notre projet nombre mystère la première implémentation que nous avons réalisée cette première implémentation bien que fonctionnelle présentait un manquement majeur il n'était pas possible pour le joueur de rejouer et de retenter un nouvel essai pour découvrir le nom mystère un seul essai était donc disponible et il fallait relancer l'application ce qui n'est pas pratique bien heureusement nous avons appris la boucle while qui veut simplement signifier tant que tant que une condition est vraie on va continuer on va donc commencer par faire l'implémentation la plus facile c'est-à-dire proposer à l'utilisateur de jouer tant qu'il n'a pas gagné ainsi on va déclarer un Boulen gagner est égal à false alors remarquez d'ailleurs que Visual Studio code me proposit gagner avec un e accent et que même si en effet cela est possible de mettre des caractères accentués dans les fichiers de code c#arp je préfère rester sur des caractères qui existent en anglais pour éviter toute confusion et toute erreur lors du processus de compilation si ce n'est que lors que on va travailler avec des chaînes de caractères je me l'autorise mais pour les variables et pour tous les éléments de code qui ne sont pas des chaînes je préfère m'en tenir à des éléments qui sont disponibles dans la langue anglaises donc des caractères non accentués maintenant que j'ai déclaré gagn ce qu'il va falloir faire c'est exécuter le code qu'il y a ici donc le code ce que l'utilisateur tente de découvrir le nombre mystère dans une boucle while ainsi par exemple je vais faire while gagner est égal à false je veux faire ce CODEL comme ceci alors ici je vais formater mon code comme vous le voyez même si je mets la collade à la ligne je n'ai pas un décalage ici visuel sur la droite parce que while crée un nouveau bloc et donc devrait typiquement décaler vers la droite le code qu'il contient je vais donc faire contrôle M P taper format et comme on peut le voir le raccourci sur mon installation est M plus al + F je peux donc choisir indistinctement de cliquer sur cette ligne ou d'exécuter le raccourci mage Alt et F ce qui aura pour effet de Me formater le document et donc de créer ce décalage visuel qui est beaucoup plus plaisant et beaucoup plus facile à lire à partir de là je vais donc répéter le bloc qui est ici dans la boucle while tant que gagner est égal à false il me faut donc bien définir un moment que gagner est égal à trou à savoir quand la personne a trouvé le nombre mystère donc ici je bascule le Boulen à trou pour sortir de la boucle néanmoins ici je ne prends pas en compte les nouvelles saisies de l'utilisateur parce que en effet la saisie se passe donc ici il faut donc que je déplace le code de saisie au sein de la boucle while afin de permettre justement que l'utilisateur puisse refaire sa saisie un petit coup de formatage un espace supplémentaire pour aérer mon code et voici ce qui veut dire en l'occurrence qu'ici le boulien est initialement déclaré à false et donc tant que ce boulet 1 est égal à false donc au début je vais rentrer dans ma boucle while je vais exécuter ce code tout devrait donc fonctionner et je devrais être en capacité de jouer jusqu'à ce que je gagne lançons l'application saisissons 1 comme on peut le voir le nombre mystère est plus grand et je peux donc rejouer si je fais 5 le nombre mystère est plus grand si je fais 9 il est plus petit et si je fais 7 j'ai gagné et mon application se termine bien donc à l'aide de la boucle while j'ai donc pu mettre en place un système de jeu qui va permettre à l'utilisateur au sein de l'application de rejouer jusqu'à ce qu'il ait gagné on pourrait bien entendu améliorer un petit peu ce jeu et donner en l'occurrence ici un nombre d'essais maximum pour éviter que l'utilisateur rejoue jusqu'à ce qu'il gagne et donc par exemple qu'il perd des vies à chaque fois qu'il se trompe et cela vous ferait donc d'ailleurs pratiquer les opérateurs boulien car il faudrait tester non seulement que gagner est différent de trous mais il faudrait aussi vérifier que le nombre de vie est bien supérieur à zéro c'est un petit exercice que vous pouvez réaliser en autonomie dans le cadre du cours je vais m'arrêter là étant donné qu'ici il s'agissait de mettre en place une boucle while pour implémenter un système de jeu permettant de rejouer si on s'était trompé si vous avez réussi cet exercice et bien félicitations parce qu'en plus de la boucle fort vue précédemment vous avez maintenant les connaissances pour faire la boucle while qui s'avère être aussi une boucle très utilisée en c#arpe avec ces deux boucles vous avez déjà couvert un grand ensemble de cas d'usage il nous reste plus qu'une boucle à voir la boucle for each et avant de passer à la vidéo suivante je tiens simplement à vous dire que si vous n'avez pas réussi cet exercice avec la boucle wild je vous invite vivement à revoir la vidéo et être sûr d'avoir compris et d'avoir réussi cet exercice car cette boucle est vraiment utile et presque indispensable dans un grand nombre de programmes en ccharpe pour finir notre petit tour sur les différentes boucles utilisé en c#arp nous allons voir la boucle for each ou pour chaque en fait bien qu'il soit possible de faire le parcours entier d'une collection grâce aux boucles for et while les ingénieurs du langage c#arp ont décidé de créer une boucle particulière qui est dédiée uniquement à cela la boucle for each permet de prendre chacun des éléments un à un et d'effectuer une action avec l'élément courant durant le parcours la syntaxe est la suivante et ne ressemble pas à une syntaxe qu'on aurait déjà vu on va utiliser le mot-cé for each suivi entre parenthèses d'une déclaration de variable qui reprend le type d'éléments présents dans la collection en donnant un nom à cette variable et en séparant la déclaration de la variable de la collection que l'on souhaite parcourir par le mot-cé in prenons le temps de disséquer cette syntaxe voici la boucle for each écrite dans Visual Studio considérons que nous avons un tableau des entiers que nous avons vu dans les vidéos précédentes qui s'appelle 1 à 5 qui contient les entiers 1 à 5 ici je vais tout d'abord rappeler que le bloc qui est qui suit le forich entracolade sera exécuté pour chaque élément de la collection parcourue c'est-à-dire que chaque tant que je n'ai pas parcouru tous les éléments des entiers de la collection qui s'appelle 1 à 5 je vais exécuter le bloc qui suit le forich et dans ce bloc sera disponible une variable qui s'appellera entier qui vaudra la valeur actuelle dans la collection 1 à 5 cette variable doit être déclarée avec le type directement qui correspond au type d'éléments présents dans la collection on lui donnera un nom à l'instar de ce qu'on a fait pour la boucle fort avec int i = 0 on donnera ici le nom d'une variable qu'on va pouvoir utiliser dans le bloc qui suit la déclaration de la de la boucle forich la séparation entre la collection et la déclaration de la variable se fait par le mot-cé in et donc à droite de la mot-cé in on mettra la collection à parcourir il y a un élément sur lequel je veux attirer votre attention sur la book for each qui est très important et qu'il est nécessaire de noter il n'est pas possible de modifier une collection que l'on parcourt grâce à une boule for each par exemple si vous parcourez une liste en faisant for each int entier int in liste de dans d'entier par exemple vous ne pouvez pas au sein du bloc de la boucle for each faire un point add d'un entier dans la liste cela reviendrait à toute façon créer une boucle infinie quand bien même votre ad est basé sur une condition ça ne marchera pas car la boucle forich s'arrêtera par une erreur en disant que laitération ne veut pas se poursuive car la collection a été modifiée je vous invite maintenant à réaliser un exercice et cet exercice va encore améliorer notre jeu du nombre mystère jusqu'à présent le joueur peut jouer un C nombre de fois mais il va devoir remonter dans l'historique du terminal afin de savoir quels sont les chiffres qu'il a déjà joué par exemple si l'utilisateur a tapé 1 3 et 9 et bien il va devoir remonter dans le terminale grâce à la molette de sa souris pour voir les chiffres qu'il a déjà joué nous allons donc un petit peu améliorer l'interface graphique du jeu pour se faire nous allons stocker dans une collection comme une liste par exemple la liste des chiffres déjà joué on choisira plutôt la liste plutôt que le tableau pour la simple et bonne raison que la liste pour rappel se redimensionne automatiquement entre chaque tour de jeu on va nettoyer la console grâce à la méthode console point clear c'est l'équivalent de ce qu'on a fait précédemment quand j'ai écrit CLS qui nettoie la console cela permett de repartir d'une console nettoyée et donc d'avoir une meilleure interface graphique et au début avant de demander à l'utilisateur de saisir le nombre on va lui rappeler les nombres qu'il a déjà joué grâce à la boucle for each les nombres seront affichés dans l'ordre dans lequel ils ont été joués et non pas dans un ordre trier car actuellement nous ne sommes pas encore capables de trier ces nombres par ordre croissant ou décroissant ce parcours se fera grâce à la boucle for each sur la liste des chiffres qui auront été joués je je vous laisse donc mettre la vidéo en pause faire cet exercice et je vous donne rendez-vous dans quelques secondes pour la correction dans cet exercice afin de pratiquer la boucle for each on va améliorer notre projet nombre mystère qu'on a déjà amélioré dans la vidéo précédente afin de rajouter l'historique des nombres qui ont déjà été joués par l'utilisateur ici c'est assez simple on doit deviner un nombre entre 1 et 10 mais si on décide de monter le niveau de complexité par exemple et qu'on décide de faire deviner un nombre entre 1 et 100 il y a fort à parier que l'utilisateur ne se rappelle pas de tout ce qu'il a déjà essayé de ce fait on va améliorer tout d'abord l'application en nettoyant la console entre chaque saisie de nombre alors pourquoi cela tout simplement parce que avant nous ne nettoyons pas la console ce qui permettait à l'aide de l'historique de ce qui a été saisi auparavant d'avoir l'information mais cela crée aussi quelque chose d'assez brouillon qu'on peut constater si on décide de le lancer dans un terminal laissez-moi vous montrer rapidement si ici je tape la commande donet run et que je décide de taper différents nombres comme vous le voyez la console est assez parasitée par certains éléments qui reviennent un certain nombre de fois et donc de fait il peut-être intéressant de nettoyer la console entre chaque saisie de ce fait on peut utiliser la méthode console. clear comme ceci afin de nettoyer la console entre chaque saisie maintenant ce qu'il va falloir faire c'est afficher l'historique des nombres joués pour ce faire il va être nécessaire de sauvegarder le nombre qui a été saisi ici dans une collection afin de pouvoir l'afficher au début avant de saisir le nombre je vais donc créer ici une liste d'entier que je vais appeler nombre jouer qui va être égal à une liste vide et grâce à cécharpe 12 je peux d'orén avant déclarer une liste vide comme ceci avec un double crochet vide cela est totalement équivalent à l'utilisation de New avec des parenthèses comme ceci et d'ailleurs si je fais cela et que je laisse mon curseur sur New on peut voir que la collection peut-être simplifiée et si je demande à Visual Studio code de me simplifier l'initialisation j'ai donc l'utilisation de cette toute nouvelle fonctionnalité de cécharpe 12 qui me permet de créer une collection vide tout en gardant le type liste ainsi que tout ce qu'elle propose à partir de là à chaque fois qu'un nombre va être joué je vais l'ajouter directement avec la méthode Add dans la liste comme ceci avant de demander à l'utilisateur de saisir un nombre entre 1 et 10 je vais afficher sur la console nombre joué comme ceci et je vais donc devoir itérer sur la liste en fait la liste utilise de façon sous-jacente à tableau et donc typiquement je pourrais utiliser une boucle fort mais ici vu que je n'ai pas d'indication du nombre d'éléments qu' y a dans la liste donc pour la boucle fort je ne pourrais pas directement mettre un nombre fini je serai obligé d'utiliser la propriété count de la liste et pour ne pas complexifier les choses je vais utiliser la boucle for each qui m'indique que pour tous les éléments dans une collection je veux faire un certain algorithme donc le for each me demande de déclarer la variable qui va être utilisée lors de l'itération dans quel collection je veux me positionner donc comme on le voit c'est assez simple à comprendre et à lire pour tous les éléments appelés nB Dans la collection nombre jouet je veux faire ceci et au sein de ma boucle for each j'auraai donc accès à la variable nB qui représente l'élément courant lors du parcours de la collection et donc je vais utiliser ici console. write et je vais rajouter le nombre entouré d'espace à l'aide de l'interpolation comme ceci remarquez ici que j'utilise la méthode console.ri et non pas right line afin d'avoir tous les éléments directement sur une même ligne ce qui suppose d'ailleurs que je fasse une ligne vide à la fin de l'écriture de tous ces éléments pour m'assurer que cette ligne-l se trouve bien à la suite des autres à partir de là j'ai donc un rappel de tous les nombres que j'aurais joué tant que je n'ai pas gagné il y a une petite subtilité à partir du moment où est-ce que j'utilise console. clear l'utilisation de la console de débug avec visual tutudo code va créer un problème à l'exécution si je le lance ici comme d'habitude on peut le voir j'ai une erreur desripteur non valide tout simplement parce qu'en fait la console de dbug qui est fournie par Visual Studio code ne supporte pas l'appel à la méthode clear donc pour tester cette application je suis obligé de me rendre dans un nouveau terminal avec la commande DNET run cette fois-ci donc ici on peut voir nombre jouet qui est vide et saisir un nombre entre 1 et 10 on pourrait d'ailleurs faire un test s'assurer que on affiche uniquement cette partie-là si' il y a au moins un nombre jouet mais pour l'instant on ne va pas s'en offusquier si je tape 1 je peux voir que j'ai nombre jouet 1 qui apparaît donc bien dans la liste mais je n'ai pas l'indication ici le nombre mystère est plus petit ou plus grand cela commence à faire beaucoup de problèmes je vais donc faire contrôle C pour arrêter l'exécution de mon application et on va corriger ces quelques problèmes avant d'aller plus loin ici je vais donc faire un test je m'assurer que ma liste contient à minima un élément je peux faire ça de multiples façons en l'occurrence sur la liste nous avons une propriété count qui peut-être utilisé pour faire un comparatif vu que c'est un entier pour s'assurer qu'il est supérieur à zéro mais comme on l'a fait pour la ligne 5 on va profiter des avancées de cécharpe 11 et de ccharpe 12 pour tester la forme de notre collection donc ici on pourrait faire count super à zéro et mettre tout ce bloc là dans le le cadre du if cela fonctionnerait très bien mais on peut aussi être explicite et dire si ma collection de nombreux jouets n'est pas une collection vide en utilisant is not avec les crochets qui déclarent donc une collection vide je vais donc rapidement formater mon code et comme vous le voyez en fait ça rend le code parfois plus lisible parfois moins donc c'est pour ça que je vous ai présenté count super à Z0 qui est la façon de faire qui existe depuis le début de cécharpe cette façonl existe depuis les toutes dernières versions vous pouvez utiliser indistinctement la version que vous préférez cela n'aura pas d'incidence sur l'exécution de votre code maintenant il nous reste également une chose à résoudre c'est que l'indication qui est ici vu qu'elle est écrite sur la console et qu'après on remonte ici dans la boucle le point clear la supprime en l'occurrence ce qu'on va vouloir faire c'est stocker cette indication pour la réutiliser au prochain tour on va donc ici avoir une indication en tant que chaî de caractère et on va de la même façon tester si l'indication n'est pas nul or MT donc qui nous permet de tester qu'une chaîne de caractère contient au moins un caractère donc elle n'est pas nulle on verra plus tard le conceptte de nul dans le prochain module ou une chaî vide donc on pourrait aussi utiliser un autre test si indication est différente de Chin de vite comme ceci dans ce cas-là je vais l'afficher sur la console bien entendu pour que cela soit utile je vais reprendre indication et je vais mettre non pas console. headline mais bien indication est égale à ceci afin de sauvegarder la valeur à partir de là si je décide de reprendre mon terminal et que je fais un DNET run je devrais avoir une meilleure expérience tout d'abord on peut le remarquer je n'ai pas nombre jouet avec du vide si je saisis 1 cette fois-ci il apparaît et j'ai également l'indication le nombre mystère est plus grand de la même façon si je mets 9U on peut voir que j'ai donc neu ici le nombre mystère est plus petit et si je mets 7 félicitations vous avez gagné trouver le nombre mystère la console n'a pas été nettoyée mais au moins j'ai le message de réussite donc ici on commence à avoir un jeu qui est de plus en plus conséquent car on a rajouté plusieurs éléments intéressants dans notre jeu tout d'abord on nettoie la console entre chaque tentative de jeu pour avoir une expérience plus plaisante d'un point de vue visuel même si l'appel à cette méthode provoque des erreurs avec la console de debug de Visual Studio code donc si typiquement on veut continuer à utiliser la console de debug de Visual Studio code il nous faudra supprimer ce console. clear pour ne plus avoir d'erreur ensuite nous avons ici une liste des nombres qui ont été joués pour avoir un historique afin de s'en rappeler on utilise d'ailleurs à cet effet console.ri pour avoir tous les nombres sur une même ligne sans avoir de saut de ligne on a également la sauvegarde de l'indication et on utilise ici la nouvelle syntaxe offerte par ccharpe 11 et ccharpe 12 celle-ci esttant de ccharpe 11 qui permet de tester si une collection répond à un certain format donc ici n'est pas une collection vide à l'aide des crochets et qui permet depuis sécharpe 12 de faire également l'initialisation d'une collection à une collection qui est vide bien entendu si la moindre de ces choses-là vous embrouille n'hésitez pas à revenir à l'approche qui vous semble la plus cohérente et la plus compréhensible pour poursuivre votre apprentissage il n'est en aucun cas nécessaire d'adopter les nouvelles syntaxes si celle-ci vous embrouill mieux vaut que vous appreniez le langage avec des syntaxes qui sont plus conventionnels plutôt que de se forcer à apprendre des syntaxes qui vous mettent dans un certains embarras intellectuel et qui vous empêche de continuer votre apprentissage quoi qu'il en soit si vous avez réussi cet exercice félicitations vous savez maintenant utiliser les trois boucles de c#arp qui vont revenir de façon quasi systématique dans tous vos projets la boucle fort la boucle wi et la boucle forich si vous n'avez pas réussi la boucle forich est une indispensable avant d'aller plus loin elle est utilisée de façon systématique dès que vous allez vouloir parcourir des collections il est donc impératif de connaître et de savoir utiliser la boucle for each de connaître sa syntaxe avant de passer à la vidéo suivante abordons le dernier point de ce module qui est la gestion des erreurs on l'a vu dans une des vidéos précédentes lorsqu'un programme c#arp rencontre une erreur à l'exécution et surtout que cette erreur n'est pas gérée l'application cesse de fonctionner en affichant un message pas très compréhensible pour la majorité des utilisateurs et peut-être même pour vous qui regardez cette vidéo au-delà du fait que le message contient des informations qui peuvent d'ailleurs être sensibles cela crée une très mauvaise expérience utilisateur de plus nous sommes actuellement uniquement dans une application console cela provoquerait un plantage encore plus désagréable si l'application était une application mobile Windows ou même une application web car l'utilisateur n'aurait pas accès à l'information à laquelle il souhaite accéder en c#arp une erreur à l'exécution à un nom particulier cela s'appelle une exception reprenons un exemple qui de façon certaine provoque une erreur donc une exception à l'exécution c'est si l'utilisateur ne saisit pas un chiffre valide souvenez-vous nous avons fait du code qui est similaire à cela nous avons stocké dans une variable de type String la saisie d'un utilisateur grâce à la fonction console.reline ensuite nous avons décidé de transformer cette saisie en entier grâce à la méthode in pointpse et on a vu que si on saisissait une valeur qui n'était pas transformable en entier j'ai par exemple saisi une deuxième fois mon prénom et bien nous avons une erreur bien heureusement je détaille ici tout ce qui est attrait à l'erreur mais cela peut-être géré ce mécanisme s'appelle le try catch si on devait traduire littéralement les mots c'est essayer et attraper donc essae de faire quelque chose et si ça ne marche pas attrape l'erreur en vol pour ne pas qu'elle impacte l'utilisateur le mécanisme est défini comme cela nous avons un bloc try et un bloc Catch c'est-à-dire qu'on va écrire le motcé try suivi d'un bloc avec des accolades à la suite de ce bloc tril nous aurons un bloc catch avec des accolades bien entendu le mécanisme de gestion des erreurs va beaucoup plus loin que cette simple syntaxe que j'ai mis ici nous aurons l'occasion de revenir en détail dessus lors de module plus avancé il s'agit ici d'une gestion des erreurs de base donc nous avons n avons ici en dessous du trail le bloc qui contient le code entre guillemets à essayer c'est-à-dire le bloc de code qui pourrait potentiellement créer une erreur à l'exécution et nous avons ici le bloc qui contient le code à exécuter en cas d'erreur pour dire et bien une erreur a été rencontrée je vais essayer de la gérer comme ça si l'erreur ne peut pas être gérée proprement c'est-à-dire que le les le programme est arrivé dans un état qualifié d'instable et bien dans ce cas-là le mieux est encore de reconnaître ses manquements et ses faiblesses d'afficher l'utilisateur d'afficher à l'utilisateur comme quoi le programme n'est plus dans un état stable et il va donén avant s'arrêter et on invite l'utilisateur à le relancer cela peut vous paraître obscur et c'est pourquoi je vous propose de faire un petit exercice encore une fois nous allons améliorer notre jeu du nombre mystère jusqu'à présent le joueur peut saisir une valeur différente d'un entier et faire donc planter l'til l'application si lorsqu'on demande au joueurs de saisir un Antier entre 1 et 10 il tape une valeur quelconque et bien nous allons avoir une erreur qui va provoquer le plantage du jeu et qui de fait ne permettra pas au joueurs de continuer par rapport à ce que nous avons appris nous allons maintenant améliorer le comportement du jeu à savoir si l'utilisateur saisit un chiffre c'est-à-dire que la méthode in pointpse peut s'exécuter et ne renvoie donc pas d'erreur pas d'exception on continue le fonctionnement tel qu'il est prévu cependant si l'utilisateur saisit une autre valeur qui n'est pas convertible en entier nous allons afficher un message sur la console en lui demandant de corriger sa saisie avant de continuer je vous invite donc à mettre la vidéo en pause à réaliser cet exercice par vous-même grâce à ce que vous avez appris et tout ce que vous savez petite astuce il va vous falloir utiliser d'une part le trycatch mais également un système de boucle afin afin de redemander la saisie si la valeur n'est pas n'est pas correcte donc mettez la vidéo en pause faites l'exercice je vous donne rendez-vous moins dans quelques secondes dans Visual Studio code pour le corriger de cet exercice nous ne sommes pas loin de la bonne version de notre nombre mystère il reste cependant un point assez important à traiter c'est de faire en sorte que ce que l'utilisateur a saisi soit valide pour l'instant nous n'avons pas le cas où la personne saisirait une valeur qui soit en dehors des bornes de ce qu'on demande donc inférieur à 1 ou supérieur à 10 tout comme nous n'avons pas géré le cas où l'utilisateur saisirait une valeur qui n'est pas transformable en tant qu'entier on a vu dans le slide qu'il existait la possibilité en c#arp de faire une gestion des erreurs des exceptions avec le motcé try suivi du motcé catch en bref je vais essayer de faire le code dans un bloc et si j' trrape une exception je vais la traiter d'une certaine façon ici nous allons le voir de la façon la plus basique qui soit nous reviendrons sur le try catch ultérieurement dans cette formation pour approfondir certaines notions descendons un petit peu c'est donc ici qu'on va devoir faire notre traitement pour s'assurer que le nombre saisi est bien compris entre 1 et 10 et soit donc valide ce que nous allons faire nous allons donc déclarer tout d'abord le nombre comme étant égal à Z0 de telle sorte qu'on va créer une boucle while tant que le nombre est inférieur à 1 ou que ce nombre est supérieur à 10 on va demander la saisie nombre é= int.tpars je vais rapidement mettre ceci en forme donc ce simple code à l'aide de la boucle while nous permet de nous assurer que la personne saisit bien un nombre compris entre 1 et 10 et ne dépasse donc pas les bornes néanmoins il nous reste ici à traiter le cas où une erreur est produite parce que la fonction in.pse nous renvoie une erreur car la personne a saisi une lettre par exemple il va donc falloir faire en sorte que ce codelà soit sécurisé pour se faire on va utiliser le motcé try et comme on peut le voir Visual Studio code nous propose également un snipet try catch ou un snipet try finally on ne va pas y prêter d'attention pour l'instant car nous étudierons plus tard les concepts plus avancés autour du try catch je vais donc faire try et je vais mettre la saisie du nombre dans le tril comme on peut le voir si je mets uniquement try j'ai donc ici une erreur de compilation parce qu'il attend soit un bloc Catch soit un bloc finally on va donc mettre ici catch et on va rajouter le fait qu'on a attrapé l'exception donc on a essayé de transformer un nombre en entier et si il y a une erreur on va rentrer dans le catch alors la question c'est qu'est-ce qu'on va faire dans ce catch et bien on va simplement redéfinir le nombre comme étant égal à 0 tout simplement parce que cela va nous permettre de repartir dans la boucle while et de s'assurer qu'on va redemander encore une fois le nombre à nouveau essayons rapidement cette implémentation d net run donc ici j'ai saisir un nombre entre 1 et 10 si je fais a on peut voir que ma saisie n'est pas prise en compte si je fais 11 non plus par contre si je fais 5 nombre jouer 5 et le nombre mystère est plus grand ce qui veut dire que j'ai bien ici une gestion des erreurs et donc ça me permet de sécuriser le fait que le nombre qui a été saisi correspond bien à ce que j'attends je vais donc faire contrôle C pour arrêter mon application car je voulais juste tester ce bloc là qui m'assurait que la valeur est bien dans ce que j'attendais maintenant en terme de ceris sur le gâteau si je puis dire pour clôturer ce module on va ajoutter une toute petite amélioration à notre application nous avons en effet la notion de un bande minimum et 10 bandnes maximum qui sont définis en Durre à la fois dans cette chaîne et à la fois dans ce test le mieux étant de rendre cela configurable donc ici on va déclarer deux constantes borne min est égal à 1 et borne Max est égal à 10 cela nous permettra par la suite d'ailleurs si vous souhaitez réutiliser ce jeu d'aller changer certaines valeurs ici afin d'avoir quelque chose d'un peu plus dynamique un peu plus différent et donc ici on va s'assurer que nombre est bien supérieur à la borne m et inférieur à la borne max pour éviter divers dérapages et donc ici il faut que l'instruction prenne également en compte ses constantes donc nous allons avoir borne mine et borne max ce qui permet de rendre le code un peu plus propre et surtout d'avoir un seul endroit où est-ce qu'on va aller changer les bornes de notre jeu pour que cela soit répercuté à plusieurs endroits sans avoir d'erreurs qui soient lié à des oublis de changement de valeur à un endroit ou à un autre quoi qu'il en soit le but de cet exercice était de pratiquer le trycatch et donc si vous avez réussi à créer ce bloc de code là pour sécuriser la saisie de l'utilisateur félicitations vous avez donc acquis les fondamentaux du langage ccharpe et donc ici dans cet exercice en particulier les fondamentaux de la gestion des erreurs plus précisément des exceptions pas d'inquiétude si vous n'avez pas tout compris je vous invite quand même à revoir la vidéo parce que dans le prochain module nous allons voir des trycatch un peu plus avancés et si vous ne comprenez pas la simple structure qui est celle-ci quand on va aborder les concepts plus avancés vous risquez d'être un petit peu perdu et de ne pas saisir la puissance de cette instruction en carp pour éviter des erreurs qui pourraient faire planter vos applications bienvenue dans ce second module où nous allons parler de la programmation orientée objet avant de rentrer dans le vif du sujet sur un plan technique il est nécessaire de couvrir certains éléments théoriques pour être sûr de bien comprendre le sujet nous allons donc voir les bases de la POO pour programmation orientée objet je rappelle que le langage c#arp est un langage de programmation orienté objet cela signifie que nous allons utiliser un paradigme qui est de travailler avec des objets en c#arp tout est objet nous allons le découvrir ensemble dans ce module en vérité sans le savoir vous avez déjà travaillé avec des objets dans le module précédent et les apports en termees de connaissance de ce module vont vous permettre de mieux comprendre ce que vous avez fait dans le module précédent qui parfois pouvait vous sembler obscur certains objets sont directement déclarés dans le Framework.NET nous avons travaillé avec certains d'entre eux pour en citer un de façon explicite prenons le cas de la liste lorsque nous avons déclaré une liste nous avons travaillé avec un objet sans le savoir il faut savoir qu'il est possible et même recommandé et j'allais même presque dire obligatoire de créer nos propres objets et c'est justement tout le principe de ce module commençons par donner une définition d'un objet donc on va se poser la question mais en vérité qu'est-ce qu'un objet dans le langage commun de tous les jours un objet est une chose quelque chose de physique de tangible au niveau de la du développement un objet est un élément de code qui définit deux choses principalement les données qu'il contient et des méthodes ou des fonctions de façon générale je vais plutôt utiliser le terme méthode qui s'applique mieux au cchar que des fonctions en somme il s'agit de quelque chose qui possède des propriétés et avec lequel on peut interagir prenons un exemple concret pour que cela vous parle directement ici j'ai affiché une voiture alors on est d'accord ce n'est pas un des tout derniers modèles qui est sorti mais ça n'en reste pas moins une voiture si on se place sur un plan purement objet purement réflexion qu'est-ce qu'une voiture et bien une voiture c'est un objet qui a des propriétés et avec laquel on peut interagir si on doit ramener ça au sens sécharpe les propriétés d'une voiture sont par exemple son nombre de portes le nombre de chevaux la quantité d'essence qu'on peut avoir dans le réservoir le nombre de pneus ainsi de suite on peut aussi interagir avec une voiture on peut par exemple ouvrir la porte rouler freiner tourner le volant c'est un objet avec lequel on peut interagir faire des actions et on peut constater qu'elle a certaines propriétés en C chararpe un objet se concrétise par une classe c'est un terme très important car il il s'agit de la base de la programmation orientée objet depuis DotNet 6 c'est beaucoup moins évident comme je le disais en s'échare tout t objet parce que le code qu'on a écrit dans durant tout le module précédent se trouve au sein d'une classe en vérité ça ne se voit pas mais nous avons écrit du code au sein d'une classe qui s'appelle programme dans notre application console avant dnetis cela était flagrant parce que c'était directement affiché dans le dans le code depuisn 6 nous avons des évolutions du langage du compilateur qui permettent d'écrire directement nos instructions dans le fichier sans avoir à se préoccuper de ces notionsl ce qui permet de faire un apprentissage beaucoup plus graduel parce qu'en vrai en c#arp tout le code doit être rangé entre guillemets dans une fonction pour justement pouvoir fonctionner on peut pas écrire du code c#arp qui va s'exécuter n'importe où on doit le ranger dans des méthodes qui se trouvent au sein de classe voyons tout de suite ensemble comment créer une classe avec Visual Studio code me voici dans Visual Studio code afin de vous faire la démonstration de comment ajouter une nouvelle classe dans mon projet c#arp je suis ici dans la classe dans le fichier programme.cs de mon premier projet tout d'abord je vais en tapant sur contrôle MP m'assurer d'utiliser omnichart select project pour bien sûr mon premier projet afin d'avoir tous les outils pour mon confort de travail maintenant je souhaite ajouter une nouvelle classe que je vais appeler ma classe dans mon premier projet si j'appuie sur contrôle MHP et que je commence à taper classe donc CLA 2S je vois ici vs sharper add new carp class file en cliquant dessus je vois qu'il me demande de saisir le nom de ma nouvelle classe dans le dossier c2. courarp donc qui est le dossier racine ouvert par Visual Studio code si je crée ma classe à à ce niveau-là elle ne sera pas incluse dans mon projet directement et je risque d'avoir d'une part une erreur par rapport à ce qui aura été auto généré par l'outil et d'autre part de ne pas pouvoir prendre cette classe en compte quand bien même je la ferai glisser déposer dans mon projet l'utilisation de ce raccourci grâce à contrôle mage P peut s'avérer utile si Visual Studio code est directement ouvert au niveau d'un dossier d'un projet bien précis là nous sommes ouverts au niveau d'un dossier racine qui contient plusieurs projets c#arp de ce fait cette option n'est pas recommandée au lieu je vais donc taper sur échappe afin de supprimer la pop-up au lieu de ça je peux me mettre sur le dossier dans lequel je souhaite ajouter ma classe donc ici cours c#arp mon premier projet faire un clic droit et cliquer sur Add a new c#arp class file ce faisant la petite pop-up s'affiche de nouveau mais on voit que le dossier de destination et bien course écharpe mon premier projet je vais donc taper ici ma classe comme cela et je fais entrer le code a été généré et donc il est maintenant temps de dissquer ce code qui a été généré pour mieux comprendre quel est l'impact de ce nouveau fichier de code je vous donne rendez-vous dans les slides afin d'expliquer tout ça j'ai repris ici le code qui a été généré par l'extension vs sharper vous remarquerez que j'ai volontairement omis la première ligne car nous allons pas en parler pour le moment il s'agit de l'instruction using system.virgule nous reviendrons dessus bien entendu ultérieurement commençons par faire l'anatomie de la déclaration d'une classe nous avons en premier lieu le mot clé namespace qui veut dire espace de nom en effet en c#arp une classe doit être définie elle-même dans un espace de nom nous reviendrons sur ce qu'est un espace de nom et quelle est son utilité mais il faut savoir qu'une classe ne peut pas se promener seule au milieu de nulle part elle doit être à minima dans un espace de nom cet espace de nom est défini après le mot-clé namespace on voit ici qu'il s'appelle mon premier projet par défaut en ccharp l'espace de nom correspond au nom de votre projet et les sous-espaces de nom car nous pouvons avoir des sous-espaces de nom sont définis par la hiérarchie des dossiers qui composent votre projet pour le moment nous n'avons pas encore créé de dossier ni de sous-espace de nom nous verrons cela ultérieurement il faut juste savoir que le nom de l'espace de nom sera défini après le mot clé namespace et que les différents niveaux hiérarchiques seront symbolisés par des points pas d'inquiétude on y reviendra nous avons à la suite de l'espace de nom ce qu'on appelle le bloc de l'espace de nom c'est-à-dire entre acolade peut-être défini tout ce que cet espace de nom contient si vous vous rappelez bien pour les instructions if comme pour les boucles for while et ainsi de suite et même pour le trycatch nous avons défini à la suite de l'instruction un bloc à l'aide d'acolade on reviendra un peu plus en détail sur cette notion plus tard mais il faut savoir que tout ce qui est entre les accolades qui suivent la déclaration Nam space le nom d'un espace de nom appartient au bloc de l'espace de nom maintenant ce qui nous intéresse ça va être la classe ici pour commencer j'ai la portée elle est représentée par le motcé public qui se traduit également public en français cela veut dire que ma classe est publiquement visible donc elle n'est pas cachée tout le monde y a accès bien entendu nous allons étudier les portées plus en détail ultérieurement au sein de ce module pour le moment considérer uniquement qu'il est nécessaire d'écrire le motcé public devant le motcé classe avant de créer une classe car oui le motcé classe permet de définir que je vais crit une classe et donc est obligatoirement écrit il est placé entre la portée et et entre le nom de la classe on a vu dans Visual Studio code qu'on a écrit ma classe et donc l'outil a généré automatiquement ce qu'il était nécessaire pour que la déclaration d'une classe soit valide on retrouve donc ici en toute fin d'instruction le nom de la classe que nous avons choisi ainsi pour pouvoir définir une classe la syntaxe est la suivante la portée suivie du motet classe suivie du nom de la classe pour le moment considérez toujours que la Pée est égale à publ et que le mot clé classe se met entre public et le nom de la classe que vous avez choisi de toute manière vous ne vous poserez pas ces questions-l si vous faites exactement comme j'ai réalisé dans la démonstration juste avant pour ajouter une classe au niveau de votre projet nous retrouvons également ici le bloc de la classe donc tout ce qui sera défini dans le bloc de la classe lui appartiendra et sera donc défini uniquement dans cette classe là voilà la déclaration d'une classe et en fait c'est exactement ce qu'il s'est passé quand nous avons on créer notre projet console nous avions un aespace qui s'appelle mon premier projet dans lequel était défin une classe qui s'appelait programme et c'est au sein de cette classe programme dans une méthode bien particulière que nous avons écrit notre code nous n'avons pas vu tout ça tout simplement parce qu'on a pu aborder des notions essentielles du langage sans se préoccuper de ça au préalable mais néanmoins il faut savoir que ce CODEL a été automatiquement rangé par le compilateur dans la méthode de la classe programme nous avons donc fini avec l'anatomie de la déclaration d'une classe vous serez bien sûr amené à pratiquer dans les vidéos qui vont suivre simplement référez-vous bien à la démonstration pour être sûr de savoir comment créer une classe dans Visual Studio code grâce à l'outil vs sharper avant d'aller plus loin je souhaite faire cette petite vidéo rapide sur la notion de bloc qui est quelque chose d'essentiel en c#arp pour bien comprendre quand on a travaillé avec les instructions if avec les boucles avec le try catch ou même juste avant avec les classes on a vu que le bloc de code qui suit l'instruction se trouve entre acolade en ccharpe cette notion de bloc est importante et prédominante en effet un bloc enfant peut contenir certains éléments et cela les éléments définis dans ce bloc enfant dépendre de qui est son parent il n'est pas possible d'avoir par exemple une classe qui se trouve directement dans une méthode d'une classe c'est quelque chose qui est impossible de la même façon il n'est pas possible d'avoir une méthode qui est définie directement dans un bloc d'espace de nom vous comprendrez bien que cette notion hiérarchique est extrêmement importante et donc va avoir un impact significatif sur la façon dont est structuré notre code par exemple un espace de nom peut contenir des classes et une classe des propriétés et des méthodes et c'est uniquement dans cet ordre là on ne peut pas avoir un espace de nom défini au sein d'une méthode il faut bien respecter cette hiérarchie même si cela dans l'immédiat peut vous paraître peut-être un peu obscur ou compliqué avec la pratique cela devrait être de plus en plus évident je vous laisse donc continuer vers la vidéo suivante en gardant à l'esprit cette notion très importante que les blocs enfants qui sont définis au sein d'un bloc parents vont dépendre de ce qu'est le parent pour savoir queles peut-être les différents enfants je vous rappelle simplement une chose essentielle une classe est définie dans un espace de nom une méthode est définie dans une classe et le code est défini dans une méthode en gardant cette hiérarchie en tête vous avez là l'essentiel de ce qu'il est nécessaire et possible de faire en c#arp voyons maintenant qu'est-ce que peut contenir une classe on a vu en prenant l'exemple de la voiture qu'une classe pouvait contenir des données et des méthodes les méthodes c'est ce qui va permettre d'interagir avec une classe si on reprend l'exemple de la voiture nous avions par exemple la possibilité d'ouvrir la porte de rouler de tourner le volant et cetera nous allons donc commencer par voir la notion de méthode on va prendre un exemple qui est très simple et que vous avez déjà pratiqué la méthode right line se trouve dans la classe console c'est un cas un peu particulier nous reviendrons dessus dans le cadre de ce module mais nous avons tapé console.reline ce qui veut dire qu'on appelle la méthode right Line qui se trouve dans la classe console généralement on va plutôt travailler avec une instance d'une classe et nous verrons l'instantiation un peu plus tard nous l'avons déjà fait lorsque nous avons créé une liste et nous avons appelé la méthode Add dessus avec liste quelque chose est égal à new list de quelque chose ensuite ma liste point add une valeur mais pas d'inquiétude on va y revenir plus en détail on se focalise là vraiment sur les méthodes pour créer une méthode je dois me mettre dans le bloc d'une classe très important une méthode ne peut vivre que dans le bloc d'une classe et on va utiliser la syntaxe suivante nous aurons tout d'abord la portée suivie du type de retour après le nom et entre parenthèses nous allons décrire les paramètres dont as besoin cette méthode si on prend l'exemple de la méthode right sa portée est publique on a bien vu qu'on pouvait l'appeler sans avoir besoin de faire de choses particulières donc nous allons réutiliser le même mot-clé jusqu'à présent et dans le cas des porté on va se contenter de ça pour l'instant donc nous aurons public le type de retour est-ce que la méthode right line retourne une valeur c'est le cas par exemple de la méthode ReadLine qui renvoyait ce que la saisie ce que l'utilisateur avait saisi si vous souvenez on pouvait affecter le résultat de la saisie dans une variable dans ce cas-là le type de retour était string une chaîne de caractère il y a un mot-cés un peu spécial pour dire qu'une méthode ne retourne pas d'information c'est le mot-cé void comme écrit tout en bas de ce slide donc si on reprend right line nous aurons public void la méthode s'appelle right line donc le nom ça devient right Line et entre parenthèses qu'est-ce que nous voulons écrire les paramètres en l'occurrence quiattend la méthode pour fonctionner dans le cas de right line on a vu qu'il y avait beaucoup de cas différents mais on peut imaginer que un des paramètres serait STR valeur qui est la chaîne de caractère que je veux écrire sur la console reprenons l'exemple de ma classe et voici une méthode que j'ai décrit que nous allons disséquer ensemble tout d'abord une méthode a elle aussi son propre bloc et c'est dans ce bloc là qu'on peut écrire du code c#arp sans s rendre compte c'est dans ce bloc là qu'on a écrit le code du premier module parce que c'était automatiquement généré par le compilateur ici on va explicitement définir le bloc de la méthode une fois qu'on a écrit sa signature donc ce qu'on a vu juste avant avec la syntaxe un peu particulière c'est ce qu'on appelle une signature de méthode on va ouvrir les accolades et entre les deux accolades on aura le bloc de code de la méthode j'ai donc écrit ici une méthode qui s'appelle écrire donc on va retrouver tout d'abord la porté le motc public le type de retour qui est VO dans le cas présent c'estàd que cette méthode ne retourne pas d'information et le nom de la méthode qui s'appelle ici écrire et ensuite on va retrouver juste après les paramètres dont la méthode a besoin pour fonctionner donc ici cette méthode qui prend un paramètre qui s'appelle valeur qui est une chaîne de caractère va se contenter dans son bloc de l'écrire au niveau de la console grâce à la méthode console.r line je vous l'accorde cette méthode n'est pas très utile en l'état parce qu'on pourrait directement appeler console.r line mais rien n'empêche ici de modifier un peu cette méthode là pour rajouter des informations avant d'écrire sur la console et donc gagner du temps maintenant on a vu une méthode qui ne retournait pas de valeur on a aussi parlé du fait qu'une méthode pouvait retourner une valeur et donc si une méthode renvoie une valeur ça veut dire qu'elle possède un type de retour reprenons l'exemple qu'on a déjà parlé la méthode ReadLine de la classe console renvoie la valeur saisie par l'utilisateur et ce sous forme de chaî de caractère ce qui veut dire que la signature de cette méthode sera publique string readline et parenthèse ouvrante parenthèse fermante car elle ne prend pas de paramètres donc si notre méthode va définir un type de retour il va falloir qu'elle contienne une instruction un petit peu particulière qui utilise un motcé qu'on n pas encore vu jusqu'à présent qui est le mot-clé return qui veut dire renvoyer et ce attention très important pour chaque branche de code qui est atteignable on peut très bien décider d'avoir une seule instruction return pour toute une méthode qui serait située forcément à la fin de notre méthode c'est un cas d'usage qu'on voit et qui existe et qui est valide ou on peut très simplement également définir une instruction return dès lors qu'on en a besoin afin que la méthode s'arrête le plus vite possible à noter que si on choisit cette option là de faire le return le plus rapidement possible cela signifie que nous aurons probablement plusieurs instructions return au sein d'une seule méthode quelque chose qui est également tout à fait valide et qu'à titre personnel je pratique assez intensivement mais il faut savoir qu'il existe les deux écoles et durant les exercices au fur et à mesure des modules on sera amené à voir le fonctionnement des deux modes dis qu'on maintenant ensemble une méthode qui possède un type de retour voici la méthode lire qui permet de récupérer une valeur de la console tout d'abord étant donné que c'est une méthode il ne faut pas oublier qu'elle a un bloc dans lequel est défini le code qui va s'exécuter dès lors que cette méthode sera appelée on va retrouver la portée en effet le fait d'avoir un type de retour ne change en rien la syntaxe qu'on a vu au début c'est uniquement ici que nous aurons un type de retour et ce type de retour est explicite cette fois-ci il ne s'agit pas de void qui indique qu'il n'y avait pas de valeur de retour mais bien de string ce qui veut dire que l'appel à la méthode lire nous renverra une chaîne de caractère nous avons donc appelé notre méthode lire et on notera que celle-ci ne prend pas de paramètres attention ce n'est pas parce qu'une méthode un typ de retour que les paramètres sont interdits ici on a pris deux exemples parce qu'une méthode qui a un type de retour ne prend pas de paramètres mais il est possible qu'une méthode avec un type de retour possède des paramètres bien entendu tout comme il est possible qu'une méthode void n'ait également pas de paramètres toutes les combinaisons sont bien entendu possibles et donc dans le code de cette méthode il y a des choses qu'on a déjà rencontré on appelle console. WR line pour dire veuillez saisir une valeur on récupère la saisie grâce à la méthode console.reline et tout à la fin nous avons ici une instruction un peu particulière la coloration syntaxique nous indique d'ailleurs que le mot clé important return est un petit peu particulier parce qu'ici nous avons return suivi de la variable cette instruction va dire simplement qu'il s'agit de la valeur que la méthode lire va renvoyer on aurait très bien pu mettre return directement returncole.reline et non pas passer par une variable intermédiaire à noter que c'est possible si je suis passé par une variable c'est pour bien illustrer le fait que je renvoie ici bien une chaîne de caractère il est donc important qu'une méthode renvoie grâce à return une variable du type de retour qui est attendu si ici j'avais récupérer un entier par exemple ou un bouléen je n'aurais pas pu faire un return de mon entier au return de mon bouléen parce que ce n'est pas du type de retour attendu donc le type de retour est très important dans le sens où c'est vraiment le type de valeur que vous devez renvoyer de toute façon pas d'inquiétude le compilateur est votre ami et si vous tentez de retourner une valeur qui n'est pas valide donc il n'est pas du même type que celui qui est attendu il y aura une erreur de compilation vous empêchant d'aller plus loin maintenant pour m'assurer que vous avez bien compris tout ça on va passer à un petit exercice le but est de créer un objet qui s'appellera calculatrice je vous conseille de créer cette application console dans un projet à part entière.netnecole-ntp calculatrice et dans cet nouveau projet TP calculatrice nous allons créer une nouvelle classe appelée calculatrice donc n'oubliez pas de bien sélectionner votre projet avec omnisharp pour avoir les outil de code et n'oubliez pas également de vous servir de VS sharper afin de créer cette nouvelle classe au bon endroit et dans cette classe on va créer les méthodes qui permettent de faire les opérations mathématiques que nous avons vu dans le premier module modu ainsi nous aurons C méthodes addition soustraction multiplication division et modulo et ces méthodes bien sûr vont prendre deux valeurs en paramètres pour retourner le résultat attendu par rapport au nom de la méthode donc les méthodes définis doivent bien retourner le résultat dans le cas du TP actuel je précise également une chose qui est plus une convention syntaxique sécharpe ici j'ai mis addition soustraction multiplication division et modulo en minuscule le c#arp a une convention qui dit que le nom des méthodes doit généralement commencer par une majuscule ainsi je vous conseille de suivre cette convention pour rester dans la norme du développement c#arp donc la méthode qui s'appellera addition commencera par un A majuscule je vous laisse mettre la vidéo en pause sur cet énoncé même éventuellement revenir en arrière pour retrouver la syntaxe et comment écrire une méthode faire le TP et moi je vous donne rendez-vous dans quelques secondes pour la correction dans Visual Studio code je suis ici dans Visual Studio code j'ai donc créé pour l'occasion un nouveau projet en console appelé TP calculatrice et j'ai donc ouvert ce projet avec Visual Studio code ce qui était demandé dans le cadre de cet exercice était de créer la classe calculatrice et d'y ajouter les cinq méthodes correspondant aux cinq opérateurs qu'on va vouloir gérer dans le cadre de notre calculatrice je vais donc faire un clic droit sur le projet au niveau du solution explorer cliquer sur Add new file et ici je vais aller sélectionner classe afin de créer une nouvelle classe Visual Studio code me demande le nom de cette classe je vais donc l'appeler calculatrice on peut voir que Visual Studio code a automatiquement créé pour moi les éléments nécessaires à savoir la définition de la classe et aussi la définition de l'espace de nom à noter d'ailleurs urs ici que l'espace de nom a été utilisé avec sa syntaxe raccourci amené par c#arp 10 ce qui permet de gagner un niveau d'inventation je vais donc me mettre ici au sein de ma classe pour y définir les méthodes qui vont correspondre à son comportement il était demandé de faire du code pour les cinq opérations on a vu dans le module précédent les opérateurs il va donc s'agir ici de créer les méthodes permettant de passer deux nombres à la calculatrice pour en obtenir un résultat pour rester très simple pour le moment on ne va travailler qu'avec des entiers ce qui de fait risque de donner des résultats qu'on pourrait qualifier d'incohérent notamment pour la division parce qu'en s'écharpe un entier divisé par un entier fournira donc un entier si je divise donc 8 par 4 j'obtiendrai 2 sans trop de surprise mais si je divise 8 par 3 j'obtiendrai également un nombre entier qui ne sera pas ce qu'on pourrait espérer un nombre à virgule pour gérer les nombres à virgule il faudrait utiliser le décimal ce qui pourrait complexifier inutilement cet exercice néanmoins si vous souhaitez pousser un petit peu le curseur et utiliser des décimules au lieu des entiers je vous invite à vous référer à la vidéo dans le module précédent sur les types numériques et d'utiliser le type décimal au lieu d'entierers je vais donc commencer par créer la première méthode très simple qui va être l'addition alors quel va être le cadre de la définition de cette méthode on va la définir comme étant publique on verra plus tard la notion de porortter dans ce module ensuite je vais dire qu'est-ce qu'elle retourne donc l'addition de deux nombres fournit un résultat de type entier donc je définis ici le type in comme étant la valeur de retour je vais donc nommer ma méthode addition comme ceci et je vais définir entre parenthèses les paramètres qu'elle accepte le cadre de notre calculatrice fait que une addition va accepter deux entiers donc on va avoir NB1 et on va avoir NB2 au niveau du nommage des paramètres soyez vigilant de ne pas faire des nommages un peu trop farfelus parce que en effet ceux qui vont consommer votre classe et donc vos méthodes vont parfois peut-être se poser la question quel est donc ce paramètre avec ce nom étrange il est tout à fait possible de donner une certaine documentation pour que l'utilisateur puisse avoir des informations sur ce qu'il y a dans ce paramètre en particulier quelle est la valeur de retour et qui exécute cette méthode néanmoins la documentation qui se fait par le biais de commentairire est assez délicate à maintenir très souvent on va constater que le code a de son côté évolué mais que la documentation n'a pas été mise à jour une très grande rigueur vous permettrait d'avoir les deux et donc le meilleur des deux monde néanmoins si je devais pencher pour une approche en particulier je dirais qu'il est largement préférable que votre code soit le plus explicite possible afin d'éviter de se poser des questions lorsqu'on l'appelle ici on peut très bien comprendre que la méthode addition prend en paramètre deux nombres et va retourner l'addition de ces deux nombres si on souhaite né enmoins apporter un petit peu de contexte il suffira de se mettre au-dessus de la méthode de faire un triple Slash et comme vous le voyez Visual Studio code va me générer un énorme bloc de commentaires ce bloc de commentairire permet de donner un petit peu de contexte à l'utilisateur on va faire ceci dans le cadre de cet exercice pour que plus tard quand on va utiliser notre calculatrice vous puissiez voir quel est l'intérêt de ces blocs de commentaires mais encore une fois soyez vigilant soit faites preuve d'une extrême rigueur pour faire en sorte que le commentaire soit toujours en accord avec ce qu'il y a au niveau du code ou sinon il est peut-être préférable de se passer de ce genre de documentation si elle n'est plus du tout raccord avec ce qu'il y a au niveau du code donc ici on va dire cette méthode additionne de nombres et renvoie le résultat et donc on va spécifier pour chaque paramètre à quoi il correspond on peut voir ici qu'on a une balise XML param name est égal qui correspond donc au nom du paramètre et donc ici on va pouvoir décrire chaque paramètre comme ceci ce qui veut dire que quand quelqu'un va appeler notre méthode addition comme on le fera plus tard vous allez voir du coup que NB1 et NB2 sont spécifiés dans l'autocomplé et R va nous permettre de spécifier ce que retourne cette méthode comme ceci même si ça semble des fois un peu redondant ce bloc se marie qui prend quand même beaucoup de place à l'écran comme vous le constatez nous permet d'ajouter des détails qui peuvent être parfois pertinents et peut-être plus confortable pour l'utilisateur donc ici notre addition va être très simple on va retourner NB1 + NB2 tout simplement et on peut voir qu'on a donc satisfait le compilateur jusqu'à présent la méthode était soulignée en rouge tout simplement parce que nous avions des défini ici une valeur de retour mais nous n'avions nulle part défini le mot-cf return pour renvoyer une valeur on renvoie donc ici le résultat de l'addition on va donc faire la même chose pour la soustraction comme ceci et on peut le voir que c'est assez simple de dérouler le reste des opérations à implémenter dans notre calculatrice par le biais des méthodes c'est un petit peu toujours la même logique on va avoir un int en valeur de retour et deux nombres à gérer seul l'opérateur va changer et bien entendu le nom de la méthode afin de décrire ce que fait cette méthode je fais donc ceci rapidement comme ceci on peut donc le voir c'est assez simple de créer une méthode dans une classe il suffira simplement de définir sa portée que nous étudierons un petit peu plus tard son type de retour son nom ses éventuels paramètres n'oubliez pas que une méthode peut ne pas avoir de type de retour et dans ce cas-là on est quand même obligé d'utiliser le motcé void pour spécifier que cette méthode ne renvoie rien et une méthode peut ne pas avoir de paramètres dans ce cas-là il suffira de ne rien mettre entre parenthèses pour que la méthode ne prenne aucun paramètre j'ai donc ici dans ma calculatrice les cinq méthodes addition soustraction multiplication division et modulo il reste néanmoins un petit point qui peut-être un petit peu critique c'est au niveau de la division car en effet en mathématique il est tout bonnement impossible de diviser par É de telle sorte que si quelqu'un passe ici une valeur et à NB2 passe la valeur 0 l'application de l'opérateur divisé entre les deux provoquera une erreur à l'exécution dans ce cas-là on va faire ce qu'on appelle du code défensif c'est-à-dire qu'on va anticiper ce que l'utilisateur pourrait faire comme erreur quand c'est possible donc ici je vais simplement rajouter un test si NB2 est égal à 0 dans ce cas-là je rurne simplement zé je suis tout à fait d'accord que mathématiquement ce n'est pas du tout correct 5 di 0 ne fait pas 0 mais est tout simplement impossible en mathématique peut-être d'ailleurs que dans ce cas bien précis il est préférable de laisser l'exception divide by Z0 exception qui va indiquer à l'utilisateur qu'il a fait une erreur et a donc créé une impossibilité mathématique néanmoins si on veut se prémunir contre ce genre d'erreur qui ferait totalement planter notre application pour le moment on peut faire un return Z0 tout comme on peut simplement mettre un try catch autour de l'instruc return afin de dire si je catche une exception dans ce cas-là je vais retourner une valeur comme zéro par exemple on pourrait tout aussi bien trouver tout un ensemble de solutions pratiques à ce problème pour l'instant je vais rester ici sur NB est égal à 0 on remarquera que dans une fonction en c#arp il est possible d'avoir plusieurs fois le motcé return cela ne dérange en aucun cas le compilateur et le premier return qui aura donc été appelé va provoquer l'arrêt de la fonction avec le retour autour de la valeur de telle sorte que la suite du code ne sera jamais exécutée ici par exemple si je mets return 0 tout au début de ma fonction vous pouvez voir que peut-être ce n'est pas totalement visible au niveau de la vidéo mais les liges 29 à 33 sont de couleur un petit peu plus grisâtre un petit peu plus masqué j'ai d'ailleurs ici un warning qui me dit que ce code ne peut pas être atteint c'est le compilateur qui me prévient en disant que le code qui est donc ici n'est tout simplement pas atteignable du simple le fait que dès que je rentre dans la division je fais un return zéro donc tout ce qu'il y a après ce return en particulier ne sera donc jamais exécuté c'est donc une petite sécurité que le compilateur met en place pour vous assurer que vous n'utilisiez pas le mot-cé return qui vous empêcherait d'exécuter du code qui normalement devrait l'être ici je vais simplement le supprimer et comme vous le voyez j'ai donc plusieurs fois l'instruction return dans ma fonction sans que cela ne crée de problèm je veux donc faire ce qu'on appelle un nearly return pour dire que je veux retourner le plus tôt possible parfois certaines personnes seront un petit peu dérangées par le fait d'avoir de multiples instructions return au sein d'une fonction personnellement je tends à favoriser cette approche pour garder mon code concis et éviter trop d'imbrication néanmoins si jamais vous souhaitez ne conserver qu'une seule instruction return il est possible de modifier cette méthode en faisant le résultat est égal à é0 et si NB2 est différent de é dans ce cas-là je vais stocker dans résultat la valeur de NB1 divis par NB2 et je retourne le résultat on a donc transformé notre méthode pour n'avoir qu'une seule instruction return parfois cela est imposé dans le cadre de projet d'équipe personnellement je trouve cette syntaxe un petit peu plus lourde bien qu'il m'arrive de l'utiliser pour des cas bien précis soyez donc libre de faire l'approche que vous préférez donc vous avez ici l'approche avec un seul return et si je reviens en arrière nous avons donc ici l'approche avec plusieurs returns que je tends à favoris par souci de clarté et de concision si vous avez réussi cet exercice félicitations vous avez donc créé votre tout premier objet la calculatrice et vous lui avez ajouté un ensemble de comportements permettant d'exécuter des opérations mathématiques basiques l'addition la soustraction la division la multiplication et le modulo et si vous avez anticipé l'éventuelle erreur de la la division et bien félicitation c'était en quelque sorte le petit piège de cet exercice qui nécessitait pour une méthode en particulier d'avoir un peu plus de code si vous neavez pas fait ce n'est pas bien grave comme je l'ai dit précédemment le fait d'avoir une exception peut aussi être une implémentation valide et donc dire à l'utilisateur qu'il a raté quelque chose maintenant nous avons créé un objet avec diverses méthodes cependant comment est-ce qu'on va utiliser cet objet pour appeler les différentes méthodes dessus je vous propose que dans la prochaine vidéo nous parlons du concept de l'instantiation nous allons maintenant nous intéresser au sujet de l'instantiation d'une classe c'est quelque chose que nous avons déjà vu dans le module 1 mais je vous avais simplement dit de ne pas y prêter attention car on allait revenir dessus en détail et bien c'est le moment de le faire maintenant alors attention on va traiter que un seul sujet qui est l'instantiation d'une classe automatique nous verrons plus tard certaines notions plus avancées sur l'instantiation au sein de ce module lorsque nous avons écrit notre classe comme nous venons de le faire dans l'exercice grâce à la classe calculatrice nous avons en fait défini un modèle c'est-à-dire qu'on a créé un modèle de quelque chose qui peut être instancier et qu'on va pouvoir utiliser mais en tant que tel aujourd'hui la classe calculatrice n'est pas utilisable si vous avez essayé dans le programme.cs de taper calculatrice point vous avez bien remarqué qu'il n'y a pas addition soustraction ainsi de suite ce sont des cas un peu particuliers comme par exemple le cas de la console qui elle expose console. WR Line et readline qui sont des méthodes un peu plus particulières mais dans la grande majorité des cas et de façon la plus souvent recommandée il va nous falloir une instance c'est-à-dire un objet qui existe d'une classe qui a été décrite donc il nous faudra une instance de la calculatrice et pour qu'une instance puisse être utilisée elle va devoir être créé en mémoire et cette création en mémoire va passer également dans le stockage d'une dans une variable l'instantiation en c#arp est très simple parce que le CLR donc le runtime c#arp va se charger de déduire tout seul la quantité de mémoire dont il a besoin pour stocker un objet du type qu'on veut instancier et donc va réserver la mémoire à l'endroit qui va bien et se chargera également de la nettoyer à notre place ce sont des sujets très avancés que je ne couvrirai pas dans ce module-ci mais néanmoins il faut savoir que la seule chose que nous avons à faire est d'utiliser un mot-clé qu'on a déjà vu qui est le mot-clé new suivi du nom de la classe avec des parenthèses si je reprends l'exemple de ma classe que j'avais créé cela donnerait ce code-ci ma classe C donc je crée ici une variable qui s'appellera C qui est de type ma classe est égale à New ma classe parenthèse souvrante parenthèse fermante on a déjà fait ce code là avec la liste et je vous avais dit qu'on y reviendrait et bien nous y voilà il s'agit de l'instantiation d'une classe grâce au mot clu je dis simplement au runtime c#arp s'il te plaît réserve la mémoire d'une classe dont voici le modèle et stock cette instance dans cette variable pour qu'après je puisse l'utiliser et l'utiliser ça veut dire quoi ça veut dire aller lire ou écrire ces données chose qu'on a pas encore vu qu'on verra un peu plus tard ou appeler les méthodes de cette classe afin de travailler avec elle c'est aussi simple que ça et l'avantage du c#arp c'est que c'est lui qui va gérer la mémoire à notre place tant pour la réserver que pour la nettoyer donc on n pas besoin de faire plus que ça bien sûr il y a des moyens beaucoup plus avancés de piloter la mémoire de façon beaucoup plus précise en carpe mais ce n'est pas le sujet de ce cours d'introduction à carpe donc maintenant afin de m'assurer que vous êtes capable d'inenser une classe je vous propose un petit exercice très simple on va utiliser notre objet calculatrice nous avons donc défini dans l'exercice précédent ce qu'est une calculatrice les méthode qu'elle expose maintenant dans notre fichier programme.cs on va créer une nouvelle variable de notre calculatrice donc si vous avez déjà essayer de l'utiliser avec calculatrice point vous avez vu que ça ne marchait pas et bien reprenez votre code et créerz une variable de la classe calculatrice stocker dedans une nouvelle instance grâce au mot clean new ensuite on va offrir un petit peu d'interactivité on va demander à l'utilisateur de saisir de nombres entiers de choisir son opérateur dans une liste et comme ça on va afficher le résultat ultat si vous souhaitez simplifier cet exercice vous pouvez simplement réaliser une opération par exemple l'opération d'addition et ne pas demander à l'utilisateur de saisir son opérateur je vous donne rendez-vous dans quelques secondes dans Visual Studio code pour corriger cet exercice créer une classe qui contient diverses méthodes c'est très bien parce qu'on va pouvoir s'en servir pour encapsuler un certain nombre de comportements par le biais de méthode mais il faudrait quand même être capable de l'utiliser pour pouvoir utiliser un objet il va falloir l'instancier comme on l'a vu dans les slides cela va passer par le motcé New que vous avez en fait déjà utilisé notamment pour créer des collections comme une liste dans le module précédent ici on va donc instancier notre calculatrice afin de pouvoir utiliser les méthodes qu'elle contient je vais donc me rendre dans le programme et on va commencer par faire un petit peu de code permettant à l'utilisateur de savoir ce qu'on attend de lui notamment la saisie des nombres pour notre calculatrice ainsi que la saisie de l'opérateur il s'agit donc de faire un petit assistant permettant à l'utilisateur de saisir les différentes valeurs j'ai donc fait ici le petit assistant permettant à l'utilisateur de saisir les deux nombres qu'il va vouloir gérer au niveau de notre calculatrice ainsi que l'opérateur qu'il va vouloir utiliser maintenant il va être temps d'utiliser notre Calc culatrice en bonnet du formme on va donc créer une instance de calculatrice donc comme vous le voyez j'ai donc ici calculatrice qui est proposée avec l'espace de nom TP calculatrice si je clique dessus j'ai calculatrice qui s'écrit en verre et j'ai donc aussi Visual Studio qui m'a rajouté automatiquement l'instruction using en haut pour dire que je veux utiliser l'espace de nom donc le namespace dans laquelle cette classe a été définie je vais donc l'appeler ici calque et je vais utiliser le motl new suivi des parenthèses ce raccourci apporté par les dernières versions de c#arp évite de répéter le type qu'on va instancier en effet le compilateur et même le développeur est au courant que ici on va instancier une nouvelle calculatrice étant donné que son type a été défini ici c'est donc un raccourci d'écriture mais vous êtes tout à fait libre de répéter le type comme ceci calculatrice calque est égale à New calculatrice remarquez la présence des trois petits points parce que Visual Studio me propose d'utiliser la nouvelle façon d' écrire le New si j'utilise la petite ampoule et que j'applique la suggestion on retrouve donc le raccourci d'écriture que je vous ai montré juste avant vous avez aussi la possibilité d'utiliser le mot-cé Var ici pour simplifier l'écriture sur la partie gauche étant donné que la partie droite de l'affectation est très explicite nouvelle instance d'un objet on peut voir du premier coup d'œil que dans cette variable il y aura une calculatrice bref vous avez l'embarras du choix sur les méthodes d'écriture pour l'instantiation de de votre objet de la plus verbeuse à la plus concise d'un côté ou de l'autre du signe égal je vais donc rester ici sur cette approche à savoir la définition du type sur la partie gauche et l'utilisation du mot clé new avec les parenthèses qui ne répètent pas le type à nouveau maintenant ce que je vais devoir faire c'est faire une collection de if et de else pour savoir si l'utilisateur a saisi le symbole plus le symbole moins le symbole multiplié le symbole divisé ou le symbole modulo à afin d'appeler la bonne méthode je vais donc déclarer ici le résultat qui est égal à 0 et écrire sur la console remarquez d'ailleurs ici que j'ai utilisé la concaténation pour créer la chaîne de résultat qui affiche donc l'information à l'utilisateur vous pouvez d'ailleurs indistinctement utiliser l'interpollation si vous préférez cela n'aura pas vraiment d'impact sur une chaîne aussi petite maintenant il va être nécessaire d'aller tester l'opérateur que l'utilisateur a saisi par exemple si l'opérateur est égal à plus dans ce cas-là je vais vouloir appeler la méthode addition je vais donc reprendre l'instance de ma calculatrice donc je prends bien le nom de la variable et non pas le nom du type vu qu'il s'agit d'une méthode qui est définie sur l'instance on verra plus tard dans ce module la notion de statique qui permet d'éviter d'utiliser une instance à utiliser avec très grande parsimonie dans le cas présent la méthode addition n'est pas définie comme étant statique et donc une méthode de la classe une méthode d'instance je suis donc obligé d'avoir une instance à savoir une variable affectée avec le mot-cé New et donc ici si je mets point je vais retrouver toutes mes méthodes et si je prends addition vous allez pouvoir remarquer quelque chose d'intéressant on va retrouver dans la petite infobule ce qu'on a écrit au niveau du Commentaire notamment cette méthode additionne deux nombres et renvoie le résultat ainsi que le returns résultat de l'addition de telle sorte que quand je vais me mettre à compléter les diff différents éléments vous pouvez le voir ici en fait au fur et à mesure que mon curseur se déplace sur la ligne j'ai soit le NB1 qui est mis en gras et en bleu pour dire que je suis sur ce paramètre soit après la virgule le NB2 qui est défini en gras et en bleu pour dire que je suis sur ce paramètre et on peut donc voir que dans l'infobule ici au niveau du descriptif de ce paramètre en particulier l'information qu'on a rajouté est donc affiché au développeur comme je le disais cela permet d'apporter des informations complémentaires mais n'hésitez pas à rendre votre code le plus explicite possible pour éviter d'avoir encore une fois ce décalage entre la documentation et le code je vais donc simplement ici passer NB1 et NB2 en fait comme vous l'avez vu cela nous permet de donner un certain confort à l'utilisateur je vous recommande vivement de faire cela quand vous faites des méthodes destinées à être intégré dans des projets réutilisables type librairie ou que vous allez publier cela de façon publique mais pour le code de votre application il peut-être judicieux d'avoir le code le plus explicite possible pour éviter ces documentations qui vieillissent mal je vais donc continuer à faire des else if pour tester les différents opérateurs afin d'appeler les différentes méthodes remarquez d'ailleurs ici que j'ai oublié à la ligne 19 de récupérer le résultat de cet appel dans la variable résultat et oui la méthode addition renvoie un entier qui est le résultat de l'addition je peux donc stocker cette valeur dans la variable résultat qui nous sert exactement à cela je vais donc faire pareil pour tous les autres opérateurs afin d'appeler la méthode correspondante remarquez quelque chose l'opérateur modulo est l'opérateur par défaut en effet j'ai commencé en disant si l'opérateur est égal à plus je fais cela sinon si l'opérateur est égal à moins je fais cela sinon si pour la division sinon si pour la multiplication j'aurais très bien pu rajouter ici sinon si l'opérateur est égal à moduo dans ce cas-là je fais le moduo mais que se passe-t-il si l'utilisateur saisit un opérateur qui n'est pas reconnu alors je pourrais très bien rajouter ici un else console.reline opérateur non reconnu et faire du coup un return pour m'assurer que le code correspondant à l'affichage du résultat de votre opération est ne soit donc pas affiché et seulement opérateur non reconnu soit affiché je pourrais aussi rajouter un système de vérification à base de boucle comme on l'a fait pour le nombre mystère dans le module précédent afin de m'assurer que l'opérateur est bien un des opérateurs que je peux gérer bref encore une fois il y a de multiples façons il n'y a pas de mauvaise façon de le gérer je vous montre simplement ici une approche on pourrait très bien dire que le modulo est l'opérateur par défaut en faisant simplement un else en disant que si l'opérateur n'est pas reconnu dans ce cas-là je fais le modulo ou afficher un message d'erreur pour une meilleure expérience utilisateur je pense que le message d'erreur est mieux c'est pourquoi je vais rester sur cette approche et je vais donc ici écrire rés résultat est égal à calque point modulo de NB1 et NB2 j'ai donc fait ici l'implémentation de ma calculatrice laissez-moi juste remettre en forme le document pour les espacements entre les différents éléments j'ai donc ici l'implémentation complète d'une calculatrice alors ne vous inquiétez pas pour le console.reline qui est toujours souligné en jaune avec la notion de référence nulle on va y venir plus tard dans ce cours donc nous avons ici l'assistant où est-ce qu'on demande à la personne de saisir les deux nombres qu'il va vouloir appliquer dans son opération mathématique on lui demande également de saisir un opérateur on instantie notre calculatrice c'était le point important de cet exercice la possibilité de créer une instance de notre classe qu'on a donc défini dans la vidéo précédente pour l'utiliser plus tard au sein de notre algorithme on crée une variable de résultat et selon l'opérateur qui a été saisi on va stocker dans la variable de résultat l'appel à la méthode correspondant à l'opér opérateur donc ici plus et ainsi de suite et si l'utilisateur a éventuellement saisi un opérateur qui n'est pas reconnu on affiche sur la console qui n'est pas reconnu et pour éviter d'avoir le résultat de votre opération est zéro si l'opérateur n'a pas été reconnu on fait un return pour éviter que la suite du code s'exécute dans ce cas bien précis on va donc exécuter notre application normalement maintenant on devrait pouvoir travailler avec notre calculatrice je vais donc saisir le premier nombre 4 le deuxème 6 et je fais un plus et on voit le résultat de votre opération est 10 ce qui veut dire que ma calculatrice fonctionne bien maintenant réessayons avec un autre opérateur par exemple 10 8 et moins 10 - 8 est bien égal à 2 pas de problème pour ça alors attention parce que pour certaines opérations comme le moins par exemple l'ordre des nombres est très important pour l'addition ça n'a pas forcément d'impact tout comme la multiplication mais pour les opérations qui ont tendance à retrancher une partie c'est un important si je mets 8 par exemple en premier nombre et 10 en second nombre et que je fais moins le résultat est bien - 2 et non pas 2 il n'y a pas d'interversion possible entre les différents nombres comme c'est d'ailleurs le cas en mathématique maintenant essayons l'approche de la division par 0 si je prends 10 0 et que je divise j'obtiens donc 0 même si la division par 0 en soit en mathématique est impossible ici j'ai donc éviter une éventuelle erreur d'ailleurs comme je vous le disais si je divise 10 par 3 on on pourrait s'attendre dans le cadre des mathématiques normales d'avoir 3,33 33 33 ainsi de suite essayons dans le cadre de notre calculatrice et nous obtenons 3 tout simplement parce que 3,33333 avec une infinité de 3 si je dois le ramener à un entier je vais donc l'arrondir étant donné que c'est inférieur à 3,5 l'arrondi est donc 3 et c'est pourquoi quand on divise deux entiers même si le résultat est une opération à virgule j'obtiens donc bien un entier il faudra donc utiliser er un nombre gérant les virgules comme float double ou décimal afin d'avoir la version avec les virgules faisons un tout dernier test de notre calculatrice essayons un opérateur qui n'existe pas par exemple tapons a pour un opérateur qui n'existe pas et nous avons donc bien le message d'erreur opérateur non reconnu sans avoir le message le résultat de votre opération est de point avec 0 qui est donc la valeur qu'on a donné à notre résultat si vous avez réussi cet exercice félicitations parce qu'en plus d'avoir créé votre classe et les méthodes dans la vidéo précédente dans celle-ci vous avez réussi à l'exploiter avec succès si vous n'avez pas réussi ou qu'il y a certaines choses qui diffèrent de mon implémentation ce n'est pas bien grave le vrai point de cet exercice était l'instantiation et l'utilisation de votre objet donc si vous avez réussi à créer une nouvelle instance de la calculatrice et à appeler des méthodes dessus vous avez donc réussi cet exercice bien entendu j'ai peut-être été plus complet plus exhaustif ou vous avez peut-être d'ailleurs un code qui est légèrement différent quoi qu'il en soit si vous savez comment instancier un objet et appeler des méthode vous avez donc fait un grand pas en avant dans la programmation orientée objet maintenant dans la programmation orientée objet dans une classe on a deux types d'éléments on a les comportements qui sont définis par le biais des méthodes comme on l'a vu dans la vidéo précédente pour les définir et dans cette vidéo pour les exécuter mais il y a aussi la notion des données un objet contient également des informations en interne qui vont permettre de stocker un état et de travailler avec cet état je vous propose que dans la prochaine vidéo on aborde la question des données au sein d'une classe nous venons de voir qu'une classe peut donc être instanciée et on peut exécuter dessus des méthodes pour interagir avec elle cependant quand j'ai parl des bases de la PO j'ai également parlé des données que peut contenir une classe il y a deux types de données on va commencer par la plus simple ce qu'on appelle un membre un membre d'un objet par défaut un membre est quelque chose qui est défini comme étant accessible aussi bien en lecture qu'en écriture on pourra pas faire de distingo dès lors qu'on a créé un membre c'est lecture et écriture obligatoirement la syntaxe est très simple on va simple écrire dans le bloc de notre classe la portée donc pour le moment publique le type de données qu'on va vouloir stocker et on va lui donner un nom c'est aussi simple que ça porter type nom par exemple public int valeur et en faisant cela et bien sur ma classe je vais pouvoir aller stocker une donnée tout comme aller la lire voici un exemple dissonsle ensemble j'ai ici la portée suivi du type du membre suivi du nom du membre c'est aussi simple que ça vous faites ça dans une classe et dès lors que vous avez une instance de votre classe vous avez accès à ces données aussi bien en lecture qu'en écriture par convention le nom d'un membre commence par une minuscule vous allez trouver sur internet probablement beaucoup d'exemples et beaucoup de codes qui vont aller dans le sens contraire de ce que je viens de vous dire en fait ce que je vous dis là c'est les dernières recommandations de Microsoft pour écrire les membres aujourd'hui si vous utilisez un autre éditeur de code que Visual Studio code comme par exemple rider ou Visual Studio sous Windows il va pouvoir faire du code à votre place et par exemple générer automatiquement un membre et dans cette fonction de génération par défaut si vous ne faites aucune personnalisation il l'écrira de cette façonl c'est-à-dire en minuscule alors si après il s'agit d'un d'un nom composé bien sûr on mettra la majuscule au au mot qui suit l'espace comme on avait déjà vu dans les modules précédents par exemple âge de la personne on aura AG en minuscule puis D majuscule e minuscule et ainsi de suite le membre lui commence toujours par une minuscule vous verrez peut-être sur le net des membres qui commencent par un und ou par un m ou par autre chose ce sont des conventions qui sont datées et qui ne sont plus d'actualité je vous conseille vraiment de suivre la dernière recommandation de Microsoft dans votre développement afin d'être plus productif et d'éviter d'avoir à on va dire configurer vos outils de travail inutilement alors vous pouvez utiliser les dernières recommandations vous avez donc ici le membre le plus simple et la façon la plus simple de déclarer une donnée mais comme je l'ai dit elle souffre d'une faiblesse c'est que c'est accessible à la fois en lecture et en écriture donc dès lors que j'ai une instance de ma classe de la la classe qui s'appelle ma classe j'ai donc accès à la donnée qui est stocké dans la dans le membre données ici et bien je peux très bien aller le lire comme aller l'écrire et personne ne pourra m'en empêcher donc pour ça on a des solutions une de ces solutions c'est de passer par une propriété en fait une propriété c'est exactement pareil qu'un membre dans le dans son utilité finale dans le sens où ça va permettre de stocker une valeur mais la différence très importante avec le membre c'est qu'on peut distinguer l'opération de lecture de l'opération d'écriture donc elle a une syntaxe qui est un petit peu différente sur laquelle on va revenir un peu plus en détail plus tard mais une propriété ça s'écrit comme ça on a la portée suivie du type suivi du nom donc exactement comme vous écrirez un membre mais après on va déclarer un bloc donc avec les acolades dans lequel on va mettre get suivi de pointvgule et set suivi de pointvgule ces deux mots clés définissent en fait lecture écriture voici comment on décrirait une propriété d'un objet je retrouve donc la portée le type et le nom de la propriété là-dessus il y a pas de grande différence avec le membre si ce n'est que contrairement au membres la propriété commence elle par une majuscule vous le remarquerez ici c'est la convention et là je vais avoir ce qu'on appelle les accesseurs en lecture et en écriture en utilisant get pointvu et 7 pointvu on fait ce qu'on appelle une propriété automatique on va revenir là-dessus en fait les mots clés get et set ils indiquent simplement que la propriété peut être lu donc c'est get qui veut dire récupérer ou défini set qui veut dire définir justement si on ne met que les motclés CIV d'un pointvgule ce que je vous disais c'est qu'on parle de propriété automatique cela veut dire que c'est le compilateur qui va se charger de générer le code pour que la propriété soit complète cette possibilité n'existe que depuis c#arp 3 donc bien sûr maintenant on est sur des versions beaucoup plus élevées de carp donc la question ne se pose pas forcément mais né nmins au préalable les propriétés n'étaient pas automatiques c'est-à-dire qu'il fallait définir un corps et étant donné qu'on peut définir un corps cette possibilité est restée ça veut dire qu'en fait get et set sont en quelque sorte des espèces de petite méthodes qui vont permettre de définir la valeur par contre dès lors qu'on décide de définir get et set il va falloir si on veut stocker la donnée utiliser un membre de façon sous-jacente qui permet de conserver la valeur pas d'inquiétude je vais vous montrer un exemple voici un exemple alors l'exemple ici n'est pas complet je n'ai pas voulu le rendre plus complexe parce qu'en fait la problématique qu'on a là c'est que et le membre et la propriété sont toutes les deux publiques ce qui veut dire qu'on peut y accéder l'un comme l'autre sans avoir à faire de distingo et donc on serait tenté des fois de prendre des raccourcis et d'éviter la propriété pour accéder au membres donc pour ça on utilisera une autre portée mais vu qu'on n pas encore abordé le sujet sujet est porté je laisse ce sujet de côté pour l'instant donc on va retrouver ici en haut le membre qui va nous permettre de stocker l'information parce que infin dans tous les cas c'est bien un membre qui va stocker l'information qu'on utilise une propriété automatique ou non cela va se retouver dans un membre parce que c'est comme ça que ça fonctionne donc là on va avoir notre notre propriété et on remarque que le GET est défini c'est-à-dire qu'on a un bloc après le GET et non pas un pointvgule directement comme dans l'exemple précédent et en fait dans ce bloc qui suit le get on est sur la fonction qui permet de récupérer la donnée c'est-à-dire qu'il faut que cette fonction est une instruction return qui retourne une valeur correspondant au type de la propriété ici c'est très simple j'ai simplement retourner le membre dans lequel était stocké l'information et on aura la même chose pour le 7 donc également une espèce de minionction un peu particulière donc qui va permettre elle de décrire la donnée et on aura à l'instar du return qu'on a dans le GET là on aura un mot clé particulier qui est value qui contient la valeur qui a été fournie à la propriété donc en fait quand je vais faire ma classe point donné avec un D majuscule é= 42 je vais rentrer dans la méthode 7 et le paramètre value qui est défini ici vaudra 42 et c'est cette valeur là que je vais stocker dans données quel est l'intérêt d'avoir une propriété qui définit explicitement le G et 7 dans le cas présent il n'y a aucun intérêt parce que le code qui est affiché ici ou est-ce que j'ai décortiqué le GET et le 7 dans des fonctions unitaires c'est exactement ce que fait le compilateur pour vous lorsque vous écrivez une propriété automatique avec get pointvu et 7 pointvule le compilateur va automatiquement générer le membre et automatiquement générer les Gurs et les seturs que vous voyez à l'écran sauf que vous vous tapez uniquement ma propriété avec gt7.vu c'est un donc un grand gain de temps mais on pourrait se demander alors mais quel est l'intérêt d'avoir des propriétés où est-ce qu'on peut définir un corps et bien cela nous permettra d'avoir un comportement particulier imaginons par exemple que pour une raison ici totalement arbitraire que la valeur que je veux stocker dans cet entier doit être compris entre 0 et 100 et bien au niveau de ma fonction de 7 je pourrais faire une instruction if sur la value m'assurer que value est bien compris entre 0 et 100 avant de l'affecter à la donnée et sinon je ne fais rien et comme ça ça éviterait que le membre qui est là-haut disponible stock une mauvaise information chose que je ne peux pas faire avec un membre seul rappelez-vous il est visible à la fois en lecture et en écriture et on a aucun garde-fou c'est un petit peu ce qu'offre la propriété pour ceux qui viennent d'autres langage de développement comme le java par exemple on a des fonctions spécifiques qui sont appelées les getterters et les setterurs en c#arp ça se traduit par une propriété qui est une un raccourci syntaxique permettant d'atteindre le même objectif protéger l'accès au membres encore une fois je le répète le code qui est à l'écran n'est pas à dupliquer tel quel car il a une faiblesse le membre est accessible en lecture comme en écriture de façon publique il faudrait le rendre inaccessible mais on ne sait pas encore le faire cela viendra quand on verra les portter maintenant pour être sûr que vous avez bien compris cela vous propose un petit exercice nous allons encore travailler sur notre calculatrice jusqu'à présent on passait en tant que paramètre les valeurs pour les opérations mathématiques nous avions ainsi la fonction addition qui prenait deux entiers la fonction soustraction qui prenait deux entiers et ainsi de suite c'est très bien mais nous allons profiter de ce que nous venons de voir par rapport à au stockage des données nous allons donc définir trois propriétés opérant gauche opérant droite donc les deux opérante de l'opération et le résultat l'appel des méthodes que nous avions fait précédemment vont devoir utiliser ces deux propriété pour travailler et produire le résultat et afin de le stocker dans résultat ce qui veut simplement dire que au lieu d'avoir l'appel à addition lui passant les deux valeurs en récupérant le retour grâce à la valeur de retour de la méthode maintenant nous allons appeler addition sans paramètres et sans valeur de retour parce que cela sera stocké dans résultat il va donc nous falloir modifier notre objet calculatrice et toutes les méthodes associées afin de pouvoir atteindre cet objectif à noter il s'agit simplement d'un exercice qui vise à vous faire travailler les propriétés le code qu'on a fait précédemment sur la calculatrice est et reste totalement valide et plus qu'acceptable pour répondre à une problématique de réalisation de calculatrice mais ici on veut faire travailler les propriétés et le stockage données dans les class classe sans plus attendre je vous laisse aller vers Visual Studio code et réaliser cet exercice moi je vous donne rendez-vous dans quelques secondes pour le corriger comme nous l'avons vu dans les slides une classe peut contenir deux types différents de données si je puis dire d'une part les champs ou les membres qui sont donc des données généralement privées à des fins de stockage d'État à un niveau interne pour les besoins spécifiques de la classe et les propriétés qui quant à elles vont offrir un accès le plus souvent extérieur soit en lecture soit en écriture soit les deux dans notre cas pour notre calculatrice nous allons avoir besoin de trois propriétés c'est-à-dire trois données qu'on va pouvoir librement lire et écrire depuis l'extérieur nous améliorerons bien sûr plus tard ce comportement afin d'éviter des déconvenus comme on va le voir quand on va implémenter notre calculate revenons à notre calculatrice jusqu'à présent son fonctionnement était vraiment très simpliste elle exposait cinq méthodes qui prenaient en paramètrre les nombres et retournent le résultat de l'opération qu'on souhaite réaliser en l'occurrence la notion de nombre passés en paramètres permet de faire une opération qui va être complètement autonome mais on pourrait très bien stocker ces données au niveau de la calculatrice pour les utiliser plus tard ce qu'on va donc faire ici c'est qu' on va se mettre au début de notre calculatrice par convention les données que ce soit des champs ou des propriétés sont souvent placées au début de la classe et les méthodes après mais vous êtes libre de les placer où vous le souhaitez je vais donc respecter pour ma part ici la convention et les mettre au début de ma classe je vais donc créer une toute première propriété qui va être le résultat au lieu que nos méthodes renvoie la valeur de résultat on va simplement la stocker au niveau de notre calculatrice si d'ailleurs par la suite on souhaiterait améliorer notre calculatrice le simple fait d'avoir le résultat de l'opération précédente stocké directement dans notre classe nous permettrait éventuellement de récupérer ce résultat pour faire une autre opération mais pour l'instant on va simplement se contenter d'affecter cette propriété depuis nos méthodes je vais donc créer une propriété la déclaration d'une propriété est simple elle est un petit peu comme une méthode si je puis dire on va tout d'abord utiliser le motcé public comme je l'ai dit on reviendra plus tard sur la notion de porter on va déterminer le type de la propriété et on va lui donner un nom en l'occurrence ici résultat attention parce que ici si je mets pointvgule j'ai non pas créé ici une propriété mais un champ le champ contrairement à la propriété ne va pas permettre de gérer finement les accès en lecture ou en écriture il faut pour ça utiliser une propriété on va donc utiliser une syntaxe un petit peu étrange on va définir des accolades après le nom de notre propriété et on va utiliser le motcé GET pointvule et set pointvule le pointvule de la fin n'est donc pas du tout utile c'est en effet un petit peu étrange parce que ici il n'y a pas de parenthès ce n'est pas une méthode et en fait cela nous permet donc de créer une donnée qui dans le cas présent est accessible librement et publiquement en lecture et en écriture depuis n'importe quelle zone du code sous réserve qu'on est une instance de la classe calculatrice à partir de là je vais aussi créer mes autres propriétés remarquez qu'on a ici un snipet prop qui si je l'utilise me génère automatiquement cette ligne de code int avec My property et get et set c'est un gain de temps j'ai juste à faire Tab pour passer d'un élément à l'autre ou faire mash Tab si je souhaite revenir à l'élément précédent donc ici ça tombe bien je veux un entier je fais donc Tab my property je vais plutôt l'appeler opérand gauche et si je refais Tab j'arrive à la fin et je peux donc faire entrer et j'ai ainsi économisé beaucoup de frappes sur mon clavier pour générer une propriété recommençons la manipulation alors soyez vigilant parce que nous avons prop et après on a prop full et comme on peut le voir ici dans le petit encadré le prop full va générer la propriété et le champ concerné et remarquez que le champ utilise un mot- clé qu'on a pas encore vu qui est private ce qui veut simplement dire qu'il n'est accessible que depuis l'intérieur de cette classe mais on va y revenir IR donc on va simplement faire prop comme ceci et on va faire Tab opérand droite et de nouveau Tab comme vous le voyez cela rend donc assez facile la création des propriétés maintenant que ces propriétés sont là il va falloir les exploiter tout d'abord au niveau de notre programme au début ici on ne va pas utiliser de variables qui sont donc les variables utilisées pour les passer aux paramètres de nos méthode on va tout simplement déplacer l'instantiation de notre calculatrice au tout début de notre programme de telle sorte qu'on puisse remplacer cette variable NB1 par calque qui est donc l'instantiation de notre calculatrice et avec le point on va donc retrouver ici les différentes propriétés qu'on a créé remarqueer une différence d'iconographie les méthodes sont représentés par des petits cubes violets alors que les propriétés sont des petites clés anglaises donc si je descends je retrouve ici trois clés anglaises qui correspond donc à mes trois propriétés je vais donc ranger le premier nombre dans opérant gauche et comme vous le voyez et cela fonctionne très bien donc au lieu de stocker ça dans une variable temporaire pour faire des appels au niveau des méthodes je vais aller stocker cette donnée dans l'instance de ma classe et je vais donc faire pareil ici pour opérant droite ensuite je n'ai plus besoin de la variable temporaire résultat vu que c'est la calculatrice qui va gérer dans son état interne le résultat si je descends un tout petit peu ici je n'ai donc plus le résultat je vais faire plutôt calque point résultat et cette fois C fois-ci je ne fais pas un accès en écriture mais bien en lecture donc l'accès en écriture se fait comme ceci comme vous affecteriez n'importe quelle variable sauf qu'on va utiliser une instance de classe avec le nom de la propriété quand à l'accès en lecture il suffira simplement d'appeler la propriété cela est possible parce que nous avons get et set si par exemple ici je supprimais le mot-clé 7 vous remarquez que je n'ai pas d'erreur dans ma calculatrice ça veut tout simplement dire que la propriété opérante gauche n'est acc cible que en lecture elle est donc en lecture seule si par contre je retourne dans le programme.cs et que je remonte tout en haut on peut voir ici que j'ai une erreur de compilation et que si je laisse le souris dessus il me dit que la propriété opérante gauche ne peut pas être assignée elle est en lecture seule donc comme vous le voyez vous pouvez définir des propriétés qui sont uniquement accessibles en lecture uniquement accessible en écriture même si c'est extrêmement rare de voir ce genre de pattern ou accessible en lecture et en écriture maintenant que j'ai utilisé mes propriétés d'une part pour les affecter ici et d'autre part pour aller lire le résultat j'ai bien sûr un grand nombre d'erreurs de compilation en effet mes méthodes addition soustraction et ainsi de suite utilisaient deux paramètres et renvoyit le résultat il va donc falloir nettoyer un peu le code je vais simplement appeler la méthode addition la méthode soustraction la méthode division la méthode multiplication et la méthode modulo alors pour pourquoi est-ce que je fais cela tout simplement parce que l'appel de la méthode sur l'objet calculatrice au lieu qu'on soit obligé nous en tant qu'alant de passer les propriétés et de stocker le résultat de la méthode dans la propriété résultat on va demander à la classe de prendre cette responsabilité à savoir de stocker le résultat dans sa classe et d'utiliser ses propriété pour réaliser ces opérations donc ici mes méthodes ne seront plus avec un int renvoyer et avec de int en paramètres au lieu de ça je n'aurai pas de paramètres elle sera simplement void parce qu'elle va aller altérer la varable résultat donc ici on va simplement faire résultat est égal à opérand gauche plus opérand droite donc en fait depuis l'extérieur j'appelle la méthode addition sur une calculatrice où les éléments ont été renseigné au préalable pour que le résultat qui est donc une donnée de la calculatrice soit calculé par rapport à ces autres données et d'ailleurs on touche du doigt ici ce que je vous avais dit quand on a créé la méthode addition qu'il fallait être vigilant sur l'évolution de la méthode et du code par rapport à la documentation parce que en effet la documentation qui ici n'a pas changé par rapport au code n'est plus du tout d'actualité la méthode addition ne renvoie pas le résultat ne prend pas de paramètres et n'a pas de returns donc tout ceci n'est plus valide et ceci non plus donc au final si j'étais rigoureux dans ma documentation j'aurais simplement dû dire cette méthode additionne de nombre et renseigne la propriété résultat comme vous le voyez ce n'est pas parce que je modifie le code que la documentation va suivre d'elle-même probablement qu'un jour on va avoir un outil une extension qui va être à base d'intelligence artificielle pour nous aider dans cette tâche si la documentation est obligatoire mais pour l'heure il est nécessaire de faire preuve de rig et d'éviter de laisser une documentation qui n'est plus du tout en rapport avec le code qui a été écrit c'est bien pour ça d'ailleurs que je préfère personnellement m'en passer et comme vous le voyez si je m'en étais passé dès le début je n'aurais pas eu besoin d'aller faire cette modification de documentation qui peut-être d'ailleurs très chronophage en fonction de la quantité à mettre à jour il va donc être temps d'aller modifier chacune des méthodes non plus pour prendre les paramètres et fournir une valeur de retour mais simplement pour aller altérer les état interne de la calculatrice en fonction des valeurs qu'elle a déjà au niveau de ses données internes je fais ça rapidement ma classe a donc été modifiée maintenant au lieu de passer des paramètres à chacune des méthodes de calcul et de récupérer la valeur ce qui d'ailleurs soit dit en passant est tout à fait valide mais dans le cadre de cet exercice on va utiliser plutôt les propriétés qu'on va d'ailleurs faire évoluer dans les prochains exercices ici on a donc des méthodes qui sont void et qui ne prennent pas de part paramètre et qui vont simplement aller altérer l'intérieur de notre calculatrice de notre classe maintenant au niveau de notre programme on a donc bien l'appel aux méthodes qui vont aller impacter la calculatrice l'affectation des opérandes et le résultat essayons rapidement de voir si cela change quelque chose je vais faire un test très simple je vais additionner 10 et 5 et je peux voir que le résultat de mon opération est bien 15 donc ça n'a pas changé mais contrairement à avant c'est donc bien l'intérieur de la calculatrice qui est modifiée et son état qui restitue ce qu'on a fait comme opération si vous avez réussi cet exercice félicitations vous savez donc maintenant comment créer des propriétés et comment les exploiter afin d'améliorer votre code et de gérer un état interne à votre calculatrice si vous avez réussi l'exercice mais qu'au lieu d'utiliser des propriétés comme ceci vous avez utiliser des champs c'est-à-dire en mettant pointvgule sans le gets dans le cadre de cet exercice ce n'est pas très grave parce que pour l'instant nos propriétés ont un comportement similaire à un champ c'est-à-dire qu'ell ne gère pas finement l'accès en lecture comme en écriture d'ailleurs cela peut être problématique parce que autant les opérandes ici doivent être définis en écriture pour les affecter initialement autant le résultat qui est là on a probablement envie que ce soit uniquement la calculatrice qui puisse définir le résultat et qu'elle soit donc lisible uniquement depuis l'extérieur on pourrait être tenté de dire qu'il suffit de supprimer le set mais comme vous le voyez l'appel aux méthodes provoque de renavant une erreur parce que résultat est bien défini en lecture seule on va bien entendu résoudre ce problème parmi d'autres plus tard dans les vidéos pour l'instant la seule chose qu'il fallait faire c'était donc créer des données donc si vous l'avez fait avec des champ vous avez en quelque sorte répondu à l'exercice peut-être pas à l'énoncer qui demandait des propriétés mais répondu à l'exercice en fournissant une solution valide dans le cadre et le périmètre de cet exercice n'hésitez pas éventuellement à refaire voir à compléter votre exercice avec des propriétés pour aidere raccord avec l'implémentation actuellement à l'écran si vous n'avez pas réussi il faut savoir que la gestion des données au sein d'une classe est essentielle et qu'il est donc impératif de comprendre et de savoir faire ce qu'on a fait dans cette exercice avant de passer à la vidéo suivante je vous l'avais dit au début de ce module nous allons voir énormément de No et elles vont toutes être critiques en terme d'importance ici pour éviter encore de me répéter il s'agit de quelque chose d'extrêmement important à savoir la construction d'un objet nous avons vu précédemment comment instancier un nouvel objet avec le motcé New et en utilisant le type suivi de parenthèses vide c'est grâce à ça qu'on a pu faire new calculatrice parenthèse ouvrante parenthèse fermante il faut savoir que de façon sous-jacente ce mot cl new avec le type suivi de parenthèse va appeler une méthode qui est un petit peu spéciale qui s'appelle le constructeur le constructeur c'est lui qui est chargé de construire justement un objet alors pas d'inquiétude ce n'est pas là que vous allez devoir définir la quantité de mémoire nécessaire ou définir comment l'objet doit être créé en mémoire il s'agit simplement d'une méthode dans laquelle on va pouvoir écrire du code qui aura l'avantage de s'exécuter chaque fois qu'on va créer un nouvel objet c'est un endroit idéal par par exemple pour initialiser les valeurs d'un objet comme par exemple imaginons que notre calculatrice nous souhaitons mettre opérant droite et opérant gauche par défaut à 1 et le résultat par défaut à 0 et bien on pourrait faire ça dans le constructeur c'est du code ici qui est totalement arbitraire mais c'est comme ça qu'on pourrait le faire et en faisant cela on s'assurerait qu'à chaque fois et bien les valeurs sont bien mis dans les propriétés pour éviter qu'on ait besoin de le faire manuellement jusqu'à présent on a vu des constructeurs vides c'est-à-dire qu'on avait new le type parenthèse ouvrante parenthèse fermante sans rien mais il faut savoir qu'un constructeur est une méthode comme une aôre sur ce planl et qu'elle peut donc prendre des paramètres directement afin par exemple d'initialiser des données c'est quelque chose de très commun et que vous verrez très souvent la syntaxe du constructeur est un petit peu particulière parce qu'en fait on pourrait s'attendre à ce que le type de retour soit le type qui a la classe mais en fait en fait c'est la seule méthode de toute votre classe qui n'aura pas de type de retour ainsi vous aurez la portée le type qui donc le nom de votre classe et entre parenthèse les paramètres prenons un exemple voici le constructeur que j'ai voulu définir moi-même qui est pour la classe ma classe on remarquera qu' nous avons bien ici la portée le type qui est donc ma classe et les paramètres c'est la seule méthode qui est autorisée à ne pas avoir de valeur de retour si puis dire parce qu'en fait la valeur de retour et le nom de la méthode fusionne en quelque sorte pour reprendre le nom de la classe c'est une syntaxe un peu particulière qu'il faut connaître de façon obligatoire pour continuer et donc en fait le constructeur permet de définir un bloc ici dans le bloc du constructeur j'ai pris la donnée qui m'est passé en paramètrre de constructeur et je l'ai directement affecté à ma propriété attention si aucun constructeur n'est déclaré c'est-à-dire vous avez une classe comme calculatrice par exemple qui ne déclare aucun constructeur et bien en fait le compilateur ccharp va automatiquement en générer un pour vous qui aura la particularité d'être publique et sans paramètres c'est bien pour ça qu'on a pu créer une nouvelle instance de la classe calculatrice quand bien même on a écrit aucun constructeur à contrario il faut savoir que dès lors que vous définissez un constructeur et bien le constructeur par défaut n'est plus généré par c#arp en effet le compilateur c#arp est obligé de générer un constructeur pour que vous puissiez utiliser votre classe mais si vous en avez défini un il ne va pas mettre le sien parce qu'il considère que vous savez mieux que lui comment votre objet doit être construit et que si vous avez besoin d'un constructeur sans paramètres ce sera à vous de le déclarer également cela peut sembler un peu compliqué mais je vous propose de voir ça par le biais d'un exercice en fait on va continuer à travailler sur notre calculatrice on a fait la modification dans la vidéo précédente qui permet d'utiliser les propri é pour définir les valeurs à calculer opérant de droite opérant de gauche et résultat néanmoins si on les oublient c'est-à-dire qu'on ne les affecte pas et bien on va appeler notre méthode addition et elle ne fonctionnera pas heureusement le type entier donc int en carp a comme valeur par défaut zé ce qui veut dire tout simplement que si on affecte aucune propriété et bien appeler une addition soustraction multiplique modulo renver à zéro cela ne marchera pas par contre pour la division le cas a été géré en affectant la valeur zéro qui est mathématiquement incorrecte mais néanmoins si on les oublie nous n'aurons pas de plantage de l'application mais seulement un dysfonctionnement fonctionnel donc les deux propriétés opérant gauche et opérant droite afin d'éviter qu'on oublie de les affecter je vous propose par le biais d'un exercice de faire en sorte qu'elles sont définies lorsqu'on va créer une instance de la classe calculatrice donc en profitant de la possibilité d'utiliser le constructeur personnalisé de la classe calculatrice je vous laisse mettre la vidéo en pause faire l'exercice peut-être même revenir un peu en arrière pour revoir la syntaxe du constructeur et je vous donne rendez-vous dans quelques secondes pour le corriger de cet exercice dans la version actuelle de notre calculatrice nous avons stocké les opérantes gauche et droite dans des propriétés qui sont librement accessi en lecture mais aussi en écriture et cela est très bien comme ça maintenant il reste quand même un problème nous avons créé la classe calculatrice donc nous savons comment elle fonctionne mais imaginons que cette calculatrice fasse partie d'un package que nous avons importé dans notre projet nous n'avons pas la connaissance de comment cette dernière fonctionne on va bien entendu pouvoir utiliser intellicense intellicense c'est le procédé qui nous permet quand on a fait quelque chose et qu'on appuie sur point d'avoir le menu déroulant qui nous fait des propositions pour découvrir effectivement qu'il existe trois propriétés opérant droite et gauche ainsi que résultat et donc deviner et car c'est bien de la devinette qu'il est nécessaire de définir les opérants de gauche et droite avant d'appeler une méthode pratiquant une opération mathématique cependant ce n'est jamais une bonne idée de laisser de la place à la devinette quand il s'agit de développement mieux vaut que les choses soient explicites et que de fait il soit nécessaire de les spécifier avant de pouvoir l'utiliser c'est là que nous allons donc utiliser le constructeur de notre calculatrice on va faire en sorte qu'il ne soit pas possible de créer une calculatrice si nous ne lui fournissons pas les deux nombres à l'origine de l'opération qu'on souhaite réaliser cela limite forcément le cadre d'utilisation de notre calculatrice et mériterait bien entendu d'être largement amélioré si on souhaite avoir une calcul atrice beaucoup plus puissante qu'une qui fait que deux opérations mais dans le cas présent nous allons faire en sorte que dès lors qu'on va créer une calculatrice l'instancier il soit nécessaire de fournir les nombres pour se faire je vais me rendre dans la classe calculatrice et je vais donc créer le constructeur on l'a vu dans les slides le constructeur est une méthode un petit peu particulière parce qu'il ne définit pas de type de retour et a pour nom de méthode le nom de la classe il faudra donc faire ici public calculatrice parenthèses et ouvrir les accolades il n'est pas nécessaire de créer un constructeur comme ceci vide et sans paramètres si on en a pas besoin c'est le compilateur qui va le générer automatiquement pour nous afin qu'on puisse faire un new si on l'ajoute pas dans la classe cependant dans les cas où est-ce qu'on va en avoir besoin comme ici dans le cadre de la calculatrice il est nécessaire de le spécifier notamment parce que ici on va avoir l'opérant de gauche alors attention au nommage des paramètres c'est toujours avec une minuscule au début c'est juste que Visual Studio code me propose ici les mêmes noms que mes propriétés donc on va voir un constructeur qui prend deux entiers en paramètres opérant de gauche et opérant droite et qui va aller les stocker dans les propriétés concernées on peut d'ailleurs utiliser Visual Studio code quand je laisse ma souris sur opérant gauche j'ai ici une petite ampoule et je peux aller cliquer sur initialize property opérant gauche ce qui aura pour effet de Me générer ce code automatiquement qui est exactement ce que je souhaite faire et je peux donc faire pareil ici pour opérant droite comme ceci en définissant un constructeur avec deux paramètres je supprime par défaut le constructeur sans paramètres vu que je ne veux pas qu'il soit possible de créer une instance de ma classe sans définir ces paramètres d'ailleurs si je me rends dans la classe programme je peux voir ici Doren avant que j'ai une erreur de compilation parce que je n'ai pas le paramètre opérant de gauche ni le paramètre opérant droite fourni à mon constructeur revenons rapidement ici sur la définition de la classe on peut voir comme souvent avec Visual tuto code qu'on a ici trois petits points sous le constructeur et la proposition est d'utiliser le constructeur principal cette nouveauté apportée par c#arp 12 vous permet de définir le constructeur principal directement au niveau de la classe c'est une syntaxe qui pourrait peut-être porter à confusion donc je vais vous montrer rapidement ce que cela provoquerait si je vais donc ici faire l'utilisation du constructeur primaire je vais avoir les parenthèses au niveau de la définition de la classe avec les paramètres de mon constructeur et je vais avoir l'affectation des propriétés au niveau de la définition de la propriété je n'ai donc plus la méthode de construction ici tout a été déplacé là-bas parce que ça correspond à une syntaxe qu'on avait déjà depuis c#arpe 9 qui est dans un type un peu particulier le record et cela pourrait d'ailleurs porter énormément à confusion quand vous apprenez le langage je vais donc revenir en arrière et je vais rester avec la syntaxe traditionnelle dans le cadre de cet exercice je vous ai montré la syntaxe du constructeur principal mais en aucun cas ce n'est une obligation de l'utiliser revenons donc à notre constructeur classique on a donc un constructeur avec deux paramètres qui vont affecter les deux propriétés avec les deux paramètres très bien maintenant à l'utilisation pour instancier une nouvelle calculatrice il est donc nécessaire de fournir ces deux paramètres je vais donc redéplacer l'instantiation de ma calculatrice ici de tel sorte que je vaiscrire ici deux variables pour les passer ici à mon constructeur et comme vous le voyez ça résout le problème de compilation car en effet le mot clé new comme on l'a déjà dit quand on en a parlé dans la vidéo sur l'instantiation n'est qu'un racourci d'écriture c'est exactement pareil que de faire new calculatrice et donc de lui passer ici les deux paramètres c'est juste que c'est plus concis et plus rapide à écrire et contrairement au constructeur principal qu'on a vu juste avant je trouve que celle-ci ne crée pas trop trop de confusion mais encore une fois vous êtes tout à fait libre de l'utiliser ou pas il n'y a en aucun cas une obligation d'utiliser les nouvelles syntaxes ce qui veut donc dire maintenant que si on veut créer notre calculatrice il faut donc passer les deux nombres on va donc rendre notre code explicite et il sera donc impossible de créer une calculatrice sans fournir les deux nombres qui vont faire l'opération d'ailleurs on remarquera que étant donné que les nombres sont passés en paramètres de constructeur et ne sont plus util nulle part ailleurs car les opérations pour chacun des opérateurs mathématiques sont fait à l'intérieur de la classe on pourrait même être tenter de changer ces deux propriétés par deux membres qui de fait ne permettrai pas de faire une écriture depuis l'extérieur de telle sorte qu'on puisse simplement les définir depuis la construction mais peut-être qu'on a envie d'y accéder en lecture donc ce qu'on peut faire ici c'est par exemple supprimer le set et comme vous le voyez ça fait donc des propriétés en lecture seu qu'on va donc pas pouvoir réaffecter une fois qu'elles ont été affectées à la construction et ça ne crée absolument aucune erreur de compilation nulle part dans mon application alors peut-être que c'est un petit peu difficile à comprendre pour vous comment ça se fait qu'une propriété qui est en lecture seule peut quand même est écrite durant le constructeur et bien tout simplement parce que si une propriété est en lecture seule il faut bien un moment où à un autre définir une valeur initiale qui sera sa seule valeur vu qu'après on peut plus la réécrire et le seul moment où est-ce qu'on peut faire ça c'est dans le constructeur donc ici on pourrait rendre notre code un peu plus sécurisé en rendant les deux opérandes en lecture seule de telle sorte qu'on ne puisse les affecter que durant le processus de construction à savoir dans le code du constructeur pour éviter que par la suite quelqu'un vienne ici malencontrieusement faire un calque point opérante droite est égale à Z0 par exemple comme vous le voyez cela crée donc une erreur de compilation vu qu'elle est en écture seule comme on l'a déjà vu dans les vidéos précédentes cela nous garantit donc que la valeur qui a été donnée à la construction de la calculatrice restera la même jusqu'à la fin de l'utilisation de cet objet maintenant testons rapidement notre application pour voir si tout ceci fonctionne bien je vais faire 10 + 10 et j'ai donc bien un résultat de 20 donc le comportement n'a pas été altéré on a juste rendu notre code plus explicite si tu veux utiliser Mac calculatrice pour l'instancier il faut que tu me donnes les deux nombres dans les vidéos qui viennent on va encore améliorer ce comportement là donc il va encore y avoir du changement de code mais vous avez vu dans cette vidéo et dans cet exercice comment vous pouvez utiliser le constructeur afin d'imposer le passage de certaines valeurs initialement pour votre objet afin qu'il soit utilisable avec ces valeurs à la base si vous avez réussi cet exercice félicitations vous savez donc maintenant comment créer un constructeur et comment utiliser des informations dans le constructeur pour avoir des données initiales si vous n'avez pas réussi je vous invite à revoir l'exercice bien entendu le seul point nécessaire pour réussir cet exercice était de donner les deux opérandes dans le constructeur et de les affecter aux propriétés le fait que j'ai moi supprimé le set pour les rendre en lecture seule et rendre donc mon code plus sécurisé n'est en aucun cas une obligation et si vous navez pas fait ce n'est pas grave j'ai juste profité du corriger de cet exercice pour vous présenter cela à afin de rendre votre code plus sécurisé et donc plus harmonieux on verra dans la prochaine vidéo comment on va encore améliorer notre calculatrice donc ne vous formalisez pas si vous ne l'avez pas fait ce n'est pas bien grave voyons maintenant un concept qui est très important j'irais même jusqu'à dire centrale dans la programmation orientée objet on va parler de l'héritage alors oui le mot est bien l'héritage comme les enfants qui héritent des parents en programmation orientée objet on aura cette notion de hiérarchie entre deux classes à savoir une classe mère et une classe fille la classe fille va hériter de tous les attributs disponible de la classe mère à savoir les méthodes et les données bien sûr on verra plus tard que il est possible de limiter certaines choses et va également pouvoir définir ses propres attributs en gros qu'est-ce que ça veut dire et bien ça veut dire que j'aurais une classe de base dans laquelle j'aurais défini certaines notions que ce soit des méthodes ou des données qui seront commune à un ensemble de classes enfant de classe fille de la même façon que l'héritage fonctionne dans la société humaine et bien lorsqu'un enfant naît il va hériter de ce que ses parents vont lui léguer on aura un héritage par exemple au niveau de l'ADN et des Gunes et on aura un héritage par exemple financier et bien en programmation orientée objet on aura la même notion et ce sera la classe parent qui va décider on verra plus tard comment ce qu'elle va laisser disponible à son enfant de différentes façons en c#arp pour dire qu'une classe B va hériter d'une classe A on va utiliser une syntaxe particulière à savoir on va séparer l'information par un deux points ici dans le l'exemple de code qui est à l'écran nous avons une classe A qui est la classe mère dans le cas présent pour le moment mes classes sont vides elles n'ont aucune information c'est uniquement pour démontrer le concept ensuite sur la seconde ligne nous avons une classe B qui est suivie d'un deux point et qui rappelle classe a donc j'ai décrit ici que je veux créer une classe B qui hérite de la classe A il n'est possible d'hériter que d'une et une seule classe maximum en carp c'est-à-dire qu'on hérite d'aucune classe entre guillemets parce qu'en fait de base en s'écharpe on hérite forcément d'une classe qui est la classe Object par défaut mais on verra ça plus tard donc on peut décider d'hériter d'une autre classe ou de n'hériter d'aucune classe auquel cas c'est le compilateur qui fera l'héritage pour nous mais on ne peux pas hériter de deux classes je ne peux pas avoir une classe C qui va hériter de classe A et classe B simultanément bien que dans l'exemple suivant si j'hérite de classe B j'hérite aussi de facto de classe A je sais que ça peut paraître compliqué mais pas d'inquiétude avec les exemples et la pratique ça va être plus évident donc en fait ça va nous permettre d'introduire un nouveau concept déjà qu'on introduit l'héritage mais le concept en fait c'est ce qu'on appelle le polymorphisme parce que si classe B hérite de classe A ça veut dire que classe B va reprendre tous les attributs de classe A mais va ce qu'on va faire une opération qu'on appelle la spécification c'est-à-dire que classe B va avoir très probablement des données et des méthodes supplémentaires que classe A n'aura pas mais vu que classe B va hériter de tout ce que classe A met à disposition ça veut dire que classe B peut se comporter à minima comme une classe a donc si je dis et bien là j'ai besoin d'une instance de classe A je pourrais lui donner une instance de classe B car après tout classe B hérite de tout ce que classe A a à disposition alors avec les termes classe B classe A ça peut paraître un peu confus donc on va aller dans un exemple concret Voici une classe que j'ai appelé animal cet animal n'a qu'une seule méthode qui s'appelle manger il n'y a rien dans cet exemple qui devrait vous choquer ou vous ou être nouveau pour vous cette méthode M ne fait qu'afficher sur la console que l'animal mange bien jusque là c'est du connu maintenant voyons comment on peut introduire l'héritage dans cette exemple je vais faire ici une classe chien qui hérite de animal donc en écrivant public classe de public classe chien de point animal donc ma classe chien va hériter d'animal et au sein de la classe chien je vais rajouter la méthode void aboyer qui est écrit sur la console woof woof donc on va voir ici que un un chien est un animal parce qu'il en hérite ce qui veut dire qu'une instance de la classe chien peut aboyer parce que c'est sa méthode qui lui est propre mais peut également manger parce qu'elle a hérité des comportements et des attributs de la classe animale donc au sein de la classe chien je n'ai pas besoin de dupliquer la méthode manger elle est automatiquement présente du fait de l'héritage par animal on on va montrer ça un peu plus en détail plus tard pas d'inquiétude maintenant comment se passe l'héritage avec la notion de constructeur constructeur que nous avons vu dans la vidéo précédente et bien lorsqu'une classe mère va déclarer un constructeur c'est-à-dire que au lieu d'avoir un constructeur sans paramètres ou de n'avoir aucun constructeur et donc que le c#arp génère automatiquement le constructeur sans paramètres et bien la classe F quand elle va elle-même être construite va devoir appeler le constructeur de la classe mère oblig oigatoirement lorsqu'elle va être construite ça veut dire que je suis obligé d'avoir un constructeur dans ma classe fi qui passe une valeur fixe au constructeur de la classe mère ou qui a elle-même un constructeur permettant de satisfaire les paramètres de la classe MRE bon comment est-ce que ça se passe et bien on va utiliser un mot- clé qui s'appelle base et qui se place après le constructeur de la classe fi séparée par un deux point encore une fois le deux points est là il faut juste comprendre que en héritage en c#arp c'est le deux points qui est utilisé un peu partout je vais vous montrer pour que ce soit plus concret ici je reprends ma classe animale sauf que je l'améliore je mets un constructeur qui prend en paramètre le poids de l'animal et le stock dans une propriété il y a rien de particulier rien de bien méchant dans ce code là maintenant si j'avais ma classe chien comme je l'ai déclaré précédemment et bien quand je vais déclarer ma classe chien je suis obligé de spécifier le poids de la class classe parent animal donc je peux le faire comme cela je vais créer un constructeur chien qui aura un constructeur donc sans paramètres mais qui devra appeler le constructeur de la classe animale avec le mot-cé base en lui passant une valeur fixe ici dans le cas présent 34 donc je vais écrire mon constructeur de de la classe chien je vais ensuite mettre deux points base entre parenthèses ma valeur fixe alors ici j'ai fait volontairement le choix de mettre le deux points base à la ligne pour des raisons d'affichage mais vous pouvez très bien le mettre sur la même ligne ça n'a pas pas d'importance je peux également considérer que quand je crée un chien je dois spécifier le poids pour pouvoir le passer aux parents et au quel cas j'ai juste à créer un constructeur de ma classe chien qui prend paramètre le poids et ce paramètre je vais le passer au constructeur de ma classe parent donc on voit qu'on peut passer une valeur fixe en considérant qu'une classe fi définit forcément cette valeur comme étant une valeur fixe où on peut peut passer une valeur dynamique qui serait elle-même à paramètre de constructeur cela est assez complet et compliqué comme notion donc avant d'aller plus loin je vous propose qu'on mette ça en pratique avec un exercice l'exercice va encore nous faire transformer notre calculatrice on va donc créer une nouvelle classe qui est la classe opération ce sera la classe mère de chacune des classes fi qu'on va créer et chacune des classes F seront donc une opération addition soustraction ainsi de suite et on aura une méthode qui s'appellera exécuter qui sera donc présente dans chacune des classes héritées par exemple on aura la classe addition qui hérite d'opération et dans laquelle on aura exécuté qui fera effectivement l'addition donc on va également en profiter pour voir les sous-espaces de nom qu'on n' pas encore vu jusqu'à présent donc on va créer toutes ces classe dans un dossier qu'on va appeler opération avec un S et je vous donne un indice pour que ce ce que vous compreniez l'utilité de faire cet héritage même s'il n'est pas forcément nécessaire notre classe de base opération prendra les deux opérandes à savoir opérand droite opérand gauche dans son constructeur ce qui veut dire que toutes les classes fill qui vont hériter de opération onuront donc directement les deux propriétés opérant gauche et opérant droite de disponible mais devront également les prendre en paramètres de constructeur pour les passer à la classe mère je vous laisse donc mettre la vidéo en éventuellement revenir en arrière pour voir la syntaxe et je vous donne rendez-vous dans quelques secondes pour le corriger de cet exercice dans le cadre de cet exercice afin de pratiquer la notion d'héritage nous allons créer la classe de base la Classe M opération et nous allons faire hériter pour chacune des opérations qu'on veut implémenter une classe par exemple la classe addition qui va hériter d'opération afin de mutualiser le comportement de construction d'une une opération dans la classe mère je vais commencer par créer un nouveau dossier donc j'ai ici un bouton new folder sinon je peux faire un clic droit new folder c'est exactement la même chose et je vais donc l'appeler opération avec un S attention vigilance il ne faut pas que le nom de mon dossier soit le même que la classe sinon cela risque de créer des conflits inutiles une fois que le dossier est créé je vais pouvoir ajouter dedans une nouvelle classe que je vais appeler opération sans s cette fois qui sera donc la classe de base remarquez ici que l'extension de Visual Studio code n'a pas dans la version que j'utilise actuellement mis l'espace de nom pour respecter la convention parce qu'en effet en c#arp la convention veut que l'espace de nom respecte la hiérarchie des dossiers donc ici vu que ma classe opération a été créée dans le dossier opération avec un S je devrais avoir l'espace de nom tpcalculatrice.opération avec un S la petite ampoule qui est ici ne me propose d'ailleurs pas de corriger ce problème donc je suis obligé de le faire moi-même manuellement de rajouter donc opération comme ceci pour bien respecter la convention ce n'est pas dérangeant de ne pas respecter la convention mais c'est toujours préférable de s'aligner sur les conventions notamment pour respecter les bonnes pratiques de l'industrie ma classe opération est donc créée ici que va-t-elle contenir en fait on va mutualiser le comportant de création d'une opération reprenons notre calculatrice pour créer une calculatrice il faut fournir les deux opérandes ces deux opérandes ne sont utiles que dans le cadre d'une opération donc je vais simplement aller récupérer la construction de la calculatrice avec les opérandes je vais donc copier tout ceci pour le mettre directement dans l'opération et donc au lieu d'avoir calculatrice ça va être le constructeur de la classe opération j'aligne rapidement le code comme ceci cela veut simplement dire que dorénavant l'opération et la logique de construction d'une opération se trouve dans la classe mèire et il va donc pouvoir permettre aux classes F qui vont hériter de la classe opération de bénéficier de ce constructeur afin d'avoir certaines routines d'initialisation si nécessaire ici il ne s'agit juste que d'affecter deux propriétés mais dans des version plus complexe on pourrait avoir des choses beaucoup plus intéressantes à mettre en commun et d'ailleurs on le verra dans les vidéos qui viennent je vais donc créer ici sans plus attendre une nouvelle classe qui va être la classe addition à l'instar d'opération je vais rapidement résoudre le problème de l'espace de nom maintenant une addition est une opération ce qui veut dire que c'est un héritage c'est une spécification pour spécifier qu'une addition est une opération je vais donc faire hériter la classe addition de la classe opération pour ceci je vais mettre un deux points et je vais rajouter opération étant donné que je suis dans le même espace de nom pour l'addition que pour l'opération je n'ai pas besoin de faire de using donc si de V votre côté la classe opération n'a pas été trouvée c'est peut-être qu'elle ne se trouve toutes les deux pas dans le même espace de nom n'hésitez pas à faire le using si besoin je vais donc avoir ici une erreur de compilation parce qu'en fait la classe addition ne peut pas hériter d'opération sans fournir les paramètres de constructeur attendus par la classe opération et oui vu que addition hérite d'opération elle hérite de son comportement et donc elle hérite de sa façon d'être construite bien heureusement si je me mets sur addition ici visual stud code me propose avec la petite ampoule de générer le constructeur qui prend en paramètrre les deux opérandes et les fournis directement à la classe de base donc à la classe opération Visual Studio code va vous faire gagner un temps précieux n'hésitez pas à utiliser la petite ampoule chaque fois vous le pouvez pour avoir de l'aide dans l'écriture de votre code mais ici prenons le temps rapidement d'analyser ce qu'il a fait et n'hésitez pas d'ailleurs à éviter au début d'utiliser la petite ampoule pour faire ce genre de procédé afin d'apprendre la syntaxe la seule chose que Visual Studio code a fait c'est me créer le constructeur de la classe addition et vu que il est nécessaire de spécifier pour créer une opération les deux paramètres le constructeur de ma classe addition les prend en paramètres et les envoie à la classe parent par le biais de cette syntaxe de point base donc la classe de base et en fait ça c'est l'appel du constructeur de la classe de base en lui passant les deux paramètres soyez quand même vigilant à ne pas intervertir les paramètres soit ici en entrée soit ici en passage de paramètres pour éviter d'avoir de mauvaises surprises lors de l'exécution des opérations à partir de là j'ai donc créé ma classe addition qui hérite d'opération et du fait de l'héritage car la classe opération définit le constructeur j'ai été obligé de créer un constructeur pour ma classe addition qui envoie les paramètres de sa propre construction à la classe mère afin que celle-ci se charge de les stocker dans les propriétés pour pouvoir les utiliser on pourrait légitimement dire que ici c'est inutilement complexifié mais on va voir juste après que c'est intéressant de mutualiser du comportement et d'avoir ce système d'héritage je vais donc rapidement créer tous les autres opérateurs avec leur classe dédiée afin de respecter complètement l'énoncé de cet exercice j'ai donc créé toutes les classes pour chacune des opérations donc à division modulo multiplication et soustraction toutes les opérations sont donc créées et héritent de la classe opération dont pour l'instant la seule utilité va être de stocker pour mettre en commun toutes les opérandes pour l'instant on ne sait pas encore comment on va faire en sorte que notre calculatrice soit modifiée pour cela on le fera dans la prochaine vidéo avec l'introduction du concept de polymorphisme et on va donc modifier la calculatrice pour permettre d'utiliser toutes les opérations ainsi créées mais rendons-nous par exemple dans notre programme et faisons ici une addition donc addition est égal à new addition comme vous voyez je dois passer les deux paramètres donc O1 et O2 par exemple et à partir de là vous pouvez voir que j'ai accès aux deux propriétés opérant gauche et opérant droite donc ce qui a été défini dans la classe opération descend de façon sous-jacente dans la classe qui en hérite il nous reste une chose à faire qui était demandée dans le cadre de l'énoncer ça va être pour chacune des opérations de créer une méthode exécutée qui va stocker le résultat et de fait le résultat qui est ici en tant que propriété va lui aussi se retrouver au sein de la classe opération de telle sorte que chacune des classes qui hérite d'opération a directement une propriété résultat je vais donc dans addition faire pour l'exemple la méthode exécuté qui va simplement faire résultat est égal à opérante gauche plus opérante droite il s'agira donc simplement au niveau de la calculatrice d'avoir l'équivalent des méthodes addition dans chacune des classes représentant les opération donc ici je vais par exemple copier la méthode exécuté la mettre dans soustraction et faire tout simplement un moins et comme vous le voyez j'ai accès à résultat tout simplement parce que cette propriété est définie dans ma classe mère je n'ai plus qu'à faire en sorte de mettre tous les méthodes exécutées dans chacune des classes soyons donc vigilant ici si opérant droite est différent de ZrO dans ce cas-là je mets dans le résultat la division sinon je peux laisser la valeur par défaut de l'entier résultat qui sera donc ZrO je fais modulo et pour terminer je fais également multiplication donc on a créé une classe de base on a fait hériter toutes les opérations de cette classe de base on a mutualisé dans la classe de base les propriétés et on a implémenté la méthode exécutée dans chacune des méthodes fi maintenant vous en conviendraz it peut-être c'est un petit peu dommage d'avoir cet exécuté partout qui est dupliqué même si infin c'est nécessaire parce que chaque opération défin un comportement qui est différent et on n'a pas encore vu comment on va pouvoir modifier notre calculatrice pour profiter de ces nouvelles classe afin de pouvoir profiter de leur comportement pour améliorer notre calculatrice on va voir ça dans la prochaine vidéo quoi qu'il en soit si vous avez réussi cet exercice et que vous avez donc bien créé la classe de base opération ainsi que les cinq class fill félicitations vous savez maintenant le concept de l'héritage comment faire en sorte de créer une hiérarchie de classe afin de mutualiser du comportement dans les classes de niveau supérieur n'hésitez pas à revoir la vidéo si ce n'est pas totalement clair car ça va être essentiel de comprendre ce qu'on a fait ici avant de passer à la vidéo suivante revenons maintenant sur un concept que nous avons à peine effleuré lors de la vidéo précédente lors de l'héritage j'avais parlé du polymorphisme c'est un mot qui peut paraître de Prim àord très savant mais qui veut simplement dire plusieurs formes et c'est un des concepts je vais dire les plus puissants de la programmation orientée objet dès lors qu'on sait comment le maîtriser reprenons le cas du chien et de l'animal si un chien est un animal cela veut dire que dès lors qu'une méthode qui attend un animal en paramètres va dès lors pouvoir prendre un chien ou même toute autre classe qui hérite d'animal mais dans le cas présent on a défini que chien pourquoi et bien parce qu'un chien est un animal donc spécifie l'animal et cette notion peut-être à plusieurs niveaux prenons un exemple encore une fois imaginons que j'ai une classe caniche qui hérite de chiens donc une méthode qui attend un animal par exemple pour nourrir l'animal peut donc dès lors prendre un chien mais peut également prendre un caniche parce qu'un caniche est un chien qui est un animal ça peut sembler un peu confus dit comme ça donc on va voir ça avec des exemples de code voici la hiérarchie dont on parlait dans le slide précédent animal ensuite chien qui rit d'animal ensuite caniche qui rit de chien ce ne fait que je n'ai fait ici que d'écrire en code ce qu'on a dit oralement en français dans la slide précédente maintenant prenons une nouvelle classe qu'on appellera la SPA cette classe spa contient deux méthodes cette première méthode est la méthode nourrir qui prend en paramètre un animal et appellera la méthode manger sur l'animal reçu en paramètre la deuxième méthode dresser prendra un chien en paramètres et affichera simplement sur la console dressage en cours donc on a ici deux méthodes qui ont besoin d'un animal en général ou d'un chien en particulier et bien là on a une hiérarchie très simple mais on pourrait également imaginer qu'on a d'autres classes comme chat et oiseau qui sont également descendants de la classe animale prenons l'exemple suivant on a une méthode qu'on appelle gérer au sein de la SPA qui donc va créer un ensemble d'animaux et va appeler les méthodes donc on a une variable animale qui s'appelle animal une variable chien qui s'appelle chien variable qui s'appelle caniche chacune étant affectée à la classe correspondante et bien je peux donc appeler la méthode nourrir avec mes trois variables que ce soit animal chien ou caniche pour la simple et bonne raison que la méthode nourrir attend un animal et que donc je peux lui passer la variable animale qui est la classe de base un chien qui hérite directement d'animal ou un caniche qui hérite indirectement d'animal par le biais de la classe chien ça marche sans problème par contre si je veux appeler la méthode dresser je ne peux lui passer que chien et caniche et non pas animal parce que animal est un cran au-dessus de chien et donc étant donné que la méthode dressée attends à à minima un chien ça ne marchera pas avec animal je sais que ça peut vous paraître un petit peu bizarre mais c'est là un des concepts les plus puissants de la programmation orientée objet maintenant on va voir quelque chose associé à cette notion de multiples classes on va appeler le pattern matching alors c'est un mot qui peut sembler compliqué mais en fait on a un mot clé un peu particulier en carp qui va nous permettre de savoir si une variable un objet est bien d'un type particulier ça va être le mot clé is donc je peux simplement dire est-ce que ma variable Toto is ma classe x grâce à cette syntaxe on va pouvoir et aux avancés du langage c#arp on va pouvoir faire ça directement au sein d'une instruction if et grâce à ça on va pouvoir également récupérer une nouvelle variable qui sera dans le type désiré ça peut paraître confus donc on va voir ça par le Code ici j'ai animal mon chien est égal à nous chien alors ça peut sembler bizarre comment est-ce que c'est possible et bien souvenez-vous un chien est un animal donc je peux très bien stocker une instance de ma class chien dans une variable de type animal mais à partir du moment où je fais ça dès la ligne suivante on va considérer que la variable qui s'appelle mon chien n'est non pas un chien mais un animal parce que je l'ai déclaré dans une variable de type animal ce qui veut dire que je n'aurais pas accès à la méthode aboyer si vous essayez de le faire vous-même de votre côté en même temps que cette vidéo mettez la vidéo en pause et écrivez le code tel que je l'ai mis à l'écran animal mon chien est égal à nous chien entre parenthèse de 12 12 étant le paramètre de constructeur qui vaut le poids et essayez à la ligne suivante dans votre visuel studio code d'écrire mon chien point et voyez ce que Visual stud code vous propose dans l'autocomplé il n'y aura pas la méthode aboyer parce qu'on a mis ça dans une variable de type animal qui ne connaît pas la méthode aboyer c'est exactement pas pareil que dans notre méthode dans la slide précédente de la SPA quand on appelle la méthode nourrir qui prend en paramètre un animal et bien on ne pourra pas faire animal point aboyer parce que ça peut très bien être un chat comme ça peut très bien être un oiseau on ne sait pas que c'est forcément un chien pour ça il faut qu'on le test grâce à une instruction if et du motcé is donc ici à la ligne suivante ce qui n'a pas beaucoup d'intérêt dans le cas présent mais qui permet de vous montrer le patter matching j'ai mis if mon is chien c'est-à-dire que dans mon chien j'ai une variable de type animal mais je veux tester est-ce que cet animal que j'ai là est bien un chien je le sais par la ligne du dessus mais imaginons que j'ai reçu cet animal en paramètrre d'une méthode et que je veux tester est-ce que l'animal reçu est un chien et bien je vais faire if animal is chien et après ça je sauraai directement si l'animal reçu en paramètre est un chien mais le fait de savoir que c'est un chien ne me permettre ne me permettra toujours pas d'appeler la méthode aboyé sur l'instance animale pour ça je dois récupérer une variable de type chien qui contient le la variable animale qui a été transformé en chien et donc grâce à l'instruction is dans une instruction if je peux donner le nom de la variable que je veux récupérer après le is quelque chose donc ici j'ai if mon chien is chien donc là est-ce que mon chien est une variable de type chien ça veut dire que est-ce que la variable mon chien qui est un animal est infin un chien et si oui et bien je vais l'appeler C donc j'aurai dans mon bloc if un C sur lequel je pouvoir appeler la méthode aboyer attention je répète la classe animale ne possède pas de méthode aboyer donc je suis bien obligé de tester que l'animal reçu ou la variable qui contient un animal est bien de type chien on va décortiquer ça pour être sûr que ce soit bien compris j'ai donc ici le motcé is entre le nom de ma variable et le type que je veux tester donc le type désiré que je veux tester est situé juste après le motcé is et là je vais nommer ma nouvelle variable si la variable que je teste initialement et bien du type désiré si par contre mon chien n'est en définitif pas un chien mais est un chat ou un oiseau donc mon chien chien N pas vrai et bien je ne rentrerai d'une part pas dans le if et d'autre part je n'aurai pas la variable C à ma disposition la variable C qui est déclaré ici n'est valide que dans le bloc du if qui suit et n'est donc pas valide dans le reste des instructions cela et couvre des notions qui peuvent être compliquées et ça peut être un peu confus pour vous donc encore une fois le mieux c'est de s'exercer pour être sûr d'avoir bien compris le principe nous avons fait dans la vidéo précédente la classe de base opération et on a donc créé toutes les classes fi pour chacune des opérations mais si vous avez essayé de le faire par vous-même je l'avais dit d'ailleurs en fin de vidéo on n'a pas encore vu comment faire en sorte qu'on puisse exécuter une opération maintenant on a vu le pattern matching et donc grâce à ça on va pouvoir transformer notre calculatrice de telle sorte que le constructeur d'une calculatrice prenne une instance de la classe opération en paramètres et ensuite nous allons donc utiliser le pattern matching afin d' appeler l'exécution de l'opération dans la classe op dans la classe calculatrice donc ce qu'il va falloir qu'on fasse c'est que notre classe calculatrice prenne en paramètrre de constructeur une opération cette opération on va la stocker en tant que propriété dans notre classe calculatrice ensuite on va créer une une méthode dans notre classe calculatrice qui s'appellera exécuté et cette méthode exécuté va appeler la méthode exécuté notre classe opération mais pour pour ça on est obligé de faire le test grâce au pattern matching pour savoir si c'est une addition une soustraction une division ainsi de suite et donc transformer la variable opération dans la variable de destination et appeler la méthode exécuté cela va peut-être vous sembler un peu compliqué un peu fastidieux un peu contreproductif mais pas d'inquiétude il s'agit là de la de voir comment fonctionne le pattern matching parce que dans la prochaine vidéo je vous montrerai comment faire cela de façon beaucoup plus optimisée en terme de code je vous laisse donc revoir cette vidéo jusqu'au depuis le début pour arriver à faire cet exercice et moi je vous donne rendez-vous dans quelques secondes pour le corriger de cet exercice dans la vidéo précédente nous avons créé la classe de base opération ainsi que toutes les opérations qui en héritaent il est maintenant temps de profiter de tout ce qu'on a fait afin de faire en sorte de simplifier le fonctionnement de notre calculatrice déjà il n'est plus plus nécessaire pour une calculatrice d'avoir les propriétés de résultat opérant de gauche opérant de droite vu que ces informations sont d'or avant stocké au niveau d'une opération de la même façon toutes les méthodes servant de calcul d'une opération ne sont plus nécessaires dans la calculatrice vu qu'elles ont été déplacées dans chacune des opérations concernées de fait notre calculatrice va prendre en paramètre une opération on ne sait pas spécialement laquelle opéra et va l'exécuter donc ici je vais avoir une méthode exécutée qui va simplement exécuter l'opération il va donc être nécessaire de créer une propriété pour cette opération je vais demander à Visual stud code de me créer et de m'assigner la propriété opération comme vous pouvez le voir la petite ampoule m'a permis de réaliser cette opération très simplement je vais simplement déplacer la propriété au-dessus du constructeur comme ceci pour respecter l'ordre de convention que j'aime bien suivre à savoir les données et puis les méthodes le constructeur étant une méthode un peu particulière à partir de là on peut d'ailleurs constater que Visual Studio code m'a créé l'opération en mode read only de telle sorte comme on l'a vu dans la vidéo sur le constructeur qu'une fois qu'une opération a été donnée à la calculatrice il n'est pas possible d'en changer la méthode exécutée va simplement donc faire opér exécuter le problème c'est que exécuter n'est pas défini sur l'opération notre méthode exécuter va donc devoir déterminer quel est le type d'opération pour appeler la méthode exécutée dessus on va utiliser pour ça du pattern matching le pattern matching c'est simplement est-ce que cette classe est de telle forme et de tel type je vais donc faire un IF je vais prendre mon instance opération et je vais dire est-ce que c'est une addition en fait si l'opération est une addition is voulant dire est en anglais dans ce cas-là je vais rentrer dans cette condition et je sais pertinemment que mon opération est une addition dans des versions très anciennes de c#arp il était nécessaire de convertir l'opération en addition dans le cadre du bloc if afin de transformer au moment de l'exécution l'opération en addition pour avoir accès aux méthodes définies sur la classe addition depuis un moment maintenant on peut faire ça directement au niveau du is il suffira après le type qu'on veut tester de donner un nom et on voit que Visual Studio code me propose directement addition comme nom c'est le nom suggéré par l'outil donc je le choisis quelle est donc cette instruction on reprend si l'instance de l'opération est une addition dans ce cas bien précis crée-moi une variable locale addition et d'ailleurs on on voit ici en laissant le curseur sur addition qu'on a une variable locale de type addition qui s'appelle addition cette variable est valide dans le cadre de mon if et donc ici j'ai bien accès à ma variable addition et je peux donc appeler exécuter comme ceci on voit donc qu'on va pouvoir tester les différentes opérations avec des IF et des else if opération is soustraction et là vs code me propose encore une fois soustraction je peux donc faire entrer et faire ensuite soustraction exécuter et ainsi enchaîner les différents tests j'ai donc rajouté ici tous les différents types d'opération qu'on gère de l'addition jusqu'au moduo reste quand même à gérer le cas où l'opération n'est pas reconnue donc on va rajouter un else donc si mon opération n ni une addition ni une soustraction ni une multiplication ni une division ni un modulo je vais mettre ici console line opération non reconnue je sauvegarde je remets en forme mon document alors dans quel cas cela pourrait-il arriver dans l'état actuel des choses notre classe opération est totalement une classe comme les autres ce qui veut dire qu'il n'est pas impossible de créer une instance de cette classe et de la passer à la calculatrice sauf que l'opération en tant que telle est un concept qui est abstrait et ça tombe bien c'est le sujet de la prochaine vidéo où est-ce qu'on va aborder les classes abstraites et ce que ça représente et pourquoi les utiliser mais ici dans cet exercice l'opération est un concept abstrait et n'a donc pas de méthode exécutée directement au sein d'une opération car en effet on ne sait pas ce qu'on va faire avec les deux nombres on a défini ça dans des classes spécifiques mais dans la classe de base nous n'avons pas l'information au niveau de notre calculatrice il n'est donc pas possible de faire un opération point exécuté ici dans le cas où l'opération n'est pas un des types qu'on veut gérer vu qu'on ne sait pas quoi faire donc on met simplement opération non reconnu on on pourrait d'ailleurs aussi ici éventuellement renvoyer une erreur quelconque bref encore une fois il y a beaucoup de champ de possibilités nous on va simplement dire que l'éaration n'est pas reconnue maintenant j'ai une erreur au niveau de mon programme car en effet au niveau de ma calculatrice ici je ne peux plus passer les deux nombres directement je dois lui passer une opération sauf que je ne saurai l'opération que je dois passer à ma calculatrice que quand j'aurais analysé l'opérateur je vais donc déplacer ma calculatrice tout à la fin ici comme cela et ce que je vais faire c'est que je vais déclarer ici une opération je déclare une variable opération et je ne l'affecte pas d'ailleurs Visual Studio code me dit que la variable est déclarée mais jamais utilisée et donc je vais pouvoir la passer ici à ma calculatrice néanmoins on remarquera qu'il y a une erreur de compilation parce que Visual code me dit que la variable opération n'est jamais assignée donc ça crée en quelque sorte un problème ce que je dois faire c'est que en fonction de l'opérateur je vais devoir affecter l'opération avec le type concret c'est donc du polymorphisme vu qu'une addition est une opération je peux ranger dans une variable de type opération une instance de l'addition donc ici au lieu de faire calque addition qui de fait n'existe plus je vais dire que mon opération est égale à une nouvelle addition avec les deux nombres comme ceci et je vais donc faire ça pareil pour chaque opérateur en spécifiquement l'instance de la classe correspondant à mon opération donc comme vous le voyez je n'ai pas d'erreur de compilation parce qu'une addition est une opération une soustraction est une opération et ainsi de suite cependant remarquez que ici si je fais opération je n'ai pas accès à la méthode exécuté vu que au niveau de la classe opération cela n'est donc pas du tout défin à partir de là je vais donc pouvoir remplacer mes opérations par chacune des instances de classe concrète que je veux gérer comme ceci on remarquera que le compilateur est intelligent parce qu'en effet il a remarqué que si j'arrive sur la ligne 42 peu importe l'embranchement de code que je choisis l'opération sera affectée elle est forcément définie à un moment ou un autre et ceci parce que si l'opération n'est pas reconnue l'opérateur n'est donc pas reconnu la variable n'est certes pas affectée car elle n'est affectée que dans les cas où l'opérateur est reconnu mais j'ai ici la instruction return qui m'empêche d'aller aux lignes qui vont suivre cette instruction et donc d'avoir ici une opération qui serait potentiellement non affectée et donc dans le cas présent au lieu de s'éviter un message parasite simplement le return a tout son sens parce que si je le supprime vous voyez que j'ai une erreur de compilation qui me dit que potentiellement dans un chemin de code en particulier l'opération peut-être non assignée nous verrons plus tard dans le cadre du module suivant le concept de nul qui veut dire né Nant avec les tests qui vont bien pour faire en sorte que cette opération soit affectée au néant afin d'éviter cette erreur de compilation dans certains cas mais dans le cas présent on a la garantie que notre variable opération sera affectée dans tous les chemins de code qui mènent à la ligne 42 il nous reste un problème c'est ici à la ligne 44 la calculatrice n'a plus de propriété résultat on va donc devoir faire opération point résultat ça rajoute un petit peu de verbosité je vais vous montrer une petite astuce on peut très bien au niveau de notre calculatrice créer ici une propriété résultat et en fait utiliser une syntaxe un petit peu particulière qui dit ce n'est pas la propriété de la calculatrice c'est le raccourci vers quelque chose on va utiliser pour ça une flèche en faisant égal et le signe supérieur et on va dire opération point résultat en fait cette propriété de la classe calculatrice pointe vers la propriété résultat de opération en faisant ce raccourci je peux donc ici me passer d'opération et avoir directement accès au résultat qui n'est qu'un proxy vers l'opération avec exactement le même résultat encore une fois ce n'est qu'une petite astuce si cela vous dérange ou complexifie votre apprentissage n'hésitez pas à supprimer cette propriété et à appeler opération point résultat cela ne pose donc absolument aucun problème bien entendu toutes les petites astuces et les nouvelles syntaxes ne sont en aucun obligatoire on a donc complètement métamorphosé notre calculatrice car maintenant il n'y a plus dans la calculatrice d'intelligence de comment exécuter des opérations cette intelligence a été déplacée dans les classes d'opération ou une opération bien spécifique comme l'addition définit une méthode exécutée qui implémente le comportement métier spécifique d'une addition et donc la classe opération nous sert de classe de base afin de pouvoir travailler avec une opération on ne sait pas exactement laquelle pour l'instant mais on sait que ça va être une classe qui est une opération qui va nous permettre d'avoir accès à son résultat et donc d'avoir la possibilité de l'exécuter pour l'instant dans notre calculatrice la méthode exécutée n'est pas optimale parce qu'on utilise du pattern matching avec une liste finie d'opération donc si demain on veut rajouter une nouvelle opération qui serait intéressante dans le casre de notre calculatrice comme par exemple la puissance x^issance y et bien il faudrait rajouter ici un else if opération is puissance et faire puissance point exécuter ne vous inquiétez pas dans la prochaine vidéo je vais vous montrer comment vous pouvez résoudre ce problème facilement grâce à la notion de classe et de méthode abstraite pour l'instant on va s'arrêter là bien entendu avant d'avoir accès au résultats il est nécessaire d'appeler la méthode exécuté parce que sinon notre calculatrice ne fera jamais la méthode exécutée et l'opération ne sera donc jamais exécutée normalement tout devrait fonctionner comme avant je vais donc lancer l'application faire un petit test et je peux voir que 20 - 15 donne bien un résultat de 5 donc ça fonctionne très bien on a donc implémenté le polymorphisme et le pattern matching et si vous avez réussi cet exercice félicitations vous avez acquis deux notions extrêmement importantes extrêmement puissante et extrêmement flexible dans le cadre de la programmation orientée objet si vous n'avez pas réussi n'hésitez pas à bien revoir cette vidéo à refaire l'exercice de votre côté jusqu'à ce que vous ayez compris parce que dans la prochaine vidéo quand on va introduire le concept de l'abstraction il est nécessaire de comprendre l'héritage le polymorphisme afin de bien comprendre ce qu'on va faire pour simplifier notre code et le rendre par nature encore plus extensible maintenant que nous avons vu pas mal de concepts lié à l'héritage et au polymorphisme il est temps de voir quelque chose d'un petit peu spécifique qui est encore une fois lié à la notion d'héritage entre classes on a vu que une classe mère peut définir des méthodes et des propriétés et que de fait la classe fille hérite de ses attributs mais ce que nous n'avons pas vu c'est est-ce qu'une classe mère est capable de définir des informations méthodes et ou propriété qui peut être remplacé par la classe fille c'est-à-dire que la classe mère va dire bah voilà moi je donne une méthode qui s'appelle ma méthode et dans la classe fi je veux que ma méthode fasse un autre code que celui qui a été écrit dans la classe mère et bien vous vous en doutez c'est tout à fait possible et on appelle cela la surcharge de méthode ou de propriété une la surcharge en fait le concept est assez simple la classe mère va définir une méthode par exemple et va dire que cette méthode elle peut être réécrite par les classes fi donc on va respecter une syntaxe par particulière et utiliser deux mots- clés au niveau de la classe mère on utilisera le motscé Virtual qui va dire en fait et bien cette méthode que j'ai décrite qui est ici si une classe fille veut réécrire sa propre implémentation de cette méthode là elle pourra le faire ou elle peut utiliser la mienne ça m'est égal mais en tout cas cette méthode peut être réécrite et la classe fi une fois qu'elle va hériter d'une classe mère qui expose des méthodes qui sont marquées comme virtuel avec le motcé Virtual elle va pouvoir dire et bien moi je veux spécifier cette méthode je veux réécrire cette méthode avoir ma propre implémentation et donc elle va utiliser le mot- clé override sur la méthode à noter que dans une méthode qu'une classe fille a choisi de faire un override par exemple une classe mère a défini une méthode s'appelle ma méthode comme étant virtual la classe F ENIT un override de la méthode ma méthode elle est tout à fait dans la possibilité d'appeler la méthode de la classe mère grâce au mot-clés base comme on l'a vu dans les vidéos précédente notamment par rapport au constructeur dans ce cas elle fera base point le nom de la méthode et ça appellera la méthode parent donc on peut très bien faire une réécriture totale et ignorer tout ce qui a été défini dans la classe mère comme on peut très bien considérer qu'on va spécifier ce qui est écrit dans la classe mère et donc appeler la méthode de la classe mère avant de faire son propre code sa propre spécification voici un exemple concret on va reprendre notre hiérarchie entre animal et un animal particulier donc là en haut à gauche nous avons la classe animale qui a une méthode qui s'appelle marcher et qui est marquée comme virtual on remarquera le motcé Virtual entre la portée publique et le type de retour et ensuite nous avons une autre classe cheval qui elle hérite d'animal et qui a décidé que la méthode marché devait être réécrite dans son cas bien précis et utilise donc override en spécifiant un autre corps qui est totalement différent de celui de animal donc le mocli Virtual qui est indiqué ici ici dans la classe de base la classe mère va indiquer simplement au développeur que cette méthode en particulier peut-être redéfin éventuellement ce n'est pas obligatoire c'est au bon vouloir du développeur elle est quand même définie et ici dans la dans la classe fille on va utiliser overright pour dire et bien en fait dans ce cas particulier je veux redéfinir la méthode pour ne pas appeler l'implémentation de la classe mère on remarquera que dans le cas prés la méthode qui est overriide dans la classe fi n'a pas d'appel à la classe mère avec base point marché on aurait pu le mettre mais dans le cas présent on a décidé de complètement substituer l'implémentation donc on a vu maintenant la notion de Virtual et d'override il y a un autre concept qui va un peu plus loin que cette notion là en fait ça reprend ce qu'on vient de voir mais ça va un CR plus loin c'est ce qu'on appelle l'abstraction c'est un concept qui est extrêmement puissant en programmation orientée objet et à vrai dire si vous décidez de suivre d'autres cours que j'ai réalisé par rapport à l'architecture par rapport à au développement Web ou d'autres cours avancés et bien vous verrez que l'abstraction je l'utilise dans tous les sens car c'est quelque chose d'extrêmement puissant et d'extrêmement flexible qu'est-ce que c'est en fait on va utiliser l'abstraction pour définir un type qui n'est pas concret c'est-à-dire qu'il est abstrait jusque làà ça semble assez logique qu'est-ce que ça veut dire ne pas être concret ça veut dire qu'on ne peut pas créer d'instance en gros je vais créer une classe qui ne peut pas être instancier donc je ne peux pas faire de classe de de New ma classe parce qu'elle est abstraite mais je peux quand même définir au sein de cette classe un ensemble d'informations communes comme des méthodes ou des propriétés et donc dès lors qu'on définit une classe comme étant abstraite au-delà du fait qu'elle ne peut pas être instanciée et qu'elle contient des comportements communs on va pouvoir définir ce qu'on appelle une méthode abstraite et en fait cette méthode abstraite on peut en définir plusieurs bien sûr mais l'avantage de cette méthode abstraite c'est dès lors que une classe va hériter de cette classe qui est abstraite avec une ou plusieurs méthodes abstraites elles sont dans l'obligation de redéfinir le contenu de cette méthode c'est-à-dire que si j'ai ma classe qui contient une méthode abstraite qu'on va appeler a si je crée une une classe fi qui hérite de ma classe je suis obligé de overriider la méthode a je ne peux pas faire comme on vient de le voir juste avant avec AC le Virtual dire et bien je vais choisir l'implémentation de base étant donné que dans le cas présent il n'y a aucune implémentation de base parce que la méthode est abstraite donc grâce à ça on va pouvoir forcer l'implémentation mais on va également pouvoir se servir de cette abstraction pour spécifier grâce au polymorphisme ce que chaque classe fille aura en commun avec sa propre implémentation ça vous semble peut-être un petit peu difficile à entrevoir les les choses dans le cas présent mais pas d'inquiétude vous allez voir dans la pratique ça va devenir très vite clair concrètement comment est-ce qu'on définit une classe comme étant abstraite et ben on va utiliser le mot-cé abstract et ce mot-cé on va le définir à plusieurs endroits tout d'abord il faut savoir que une classe qui est abstraite peut contenir des méthodes abstraites et une classe qui n'est pas abstraite ne peut pas contenir de méthodes abstraitees en gros si vous utilisez le mot-cés abstract sur une méthode cela doit se faire dans une classe qui contient qui est elle-même notée comme abstract et donc une méthode qui est marquée comme abstracte ne peut pas déclarer de corps parce qu' en fait elle est abstraite donc elle doit forcément être totalement vide et cela veut cela signifie tout simplement que la méthode va se terminer par un pointvgule après sa signature c'est-à-dire qu'on aura pas d'accolade ça vous semble un peu bizarre je vais vous montrer un exemple voici la classe animale que j'ai rendu abstraite on remarquera que j'ai mis le motcé abstract de part et d'autre donc au niveau de la classe et également au niveau de la méthode marché c'est-à-dire que ma classe animale ne peut plus être instancié je ne peux plus faire animal a est égal à New animal c'est interdit car c'est une classe qui est abstraite ensuite j'ai mis également abstract au niveau de la méthode marché et on remarquera qu'il y a un pointvgule à la fin de cette méthode il n'y a pas d'acolade avec un corps maintenant j'ai la classe cheval qui hérite d'animal et on le verra dans Visual Studio code cela oblige que je fasse l'override donc on utilisera ici le même mot-cé le mot-clé override c'est le même pour faire l'implémentation d'une méthode abstraite ou pour remplacer méthode virtuelle mais la différence c'est qu'ici je suis obligé de faire l'implémentation de la méthode marché et donc de spécifier ma propre implémentation je sais que ces concepts peuvent paraître compliqués de prime à bord et même être un petit peu déroutant et c'est bien pour ça que je vous propose de voir un exercice permettant de les mettre en pratique en fait notre exercice va nous permettre de d'améliorer notre calculatrice et notre classe opération si vous vous souvenez bien dans la vidéo précédente on avait utilisé le pattern matching avec if opération is addition ainsi de suite c'est une façon de faire mais ce n'est pas la meilleure et maintenant qu'on connaît l'abstraction et l'héritage avec l'override on va utiliser ce mécanisme donc le but ultime c'est d'utiliser le mécanisme d'abstraction sur la classe opération de telle sorte qu'on ne puisse pas instancier une opération et qu'on doive redéfinir la méthode exécutée et également d'implémenter ce qui va bien dans les classes fi et comme ça nous allons utiliser ces mécanismes là afin de simplifier l'exécution comme on l'a vu aujourd'hui c'est pas encore optimal on on s'en approche mais ça l''est pas encore donc je vous propose d'atteindre cet objectif là vous avez deux façons de faire soit vous tentez directement d'y aller grâce à l'abstraction comme on vient de le voir soit vous passz dans un premier temps par la notion de Virtual et d'override afin de commencer à travailler avec cette façon de faire les deux sont totalement libres je vous montrerai dans la démo les deux façons de faire vous verrez que ce n'est pas très différent et moi je vous donne rendez-vous dans quelques secondes pour la correction dans Visual Studio code au fur et à mesure des vidéos on a pu faire évoluer notre calculatrice afin de gérer des éléments de la façon la plus programmation orientée objet qui soit notamment notre classe opération et toute descendance qui commence vraiment à ressembler à une hiérarchie d'objets assez intéressante il reste cependant quelques soucis dans notre implémentation le premier étant que effectivement ici au niveau de la calculatrice on se retrouve avec une liste d'opérations qui sont gérées et on fait cela par pattern matching non pas que ce soit une mauvaise chose il arrive assez souvent d'expérience dans le code qu'on ait besoin du pattern matching pour une chose ou l'autre mais dans le cas de list comme ceci pour gérer différents types on se retrouve avec ce qu'on appelle un système fermé où chaque nouvelle opération va nécessiter de la modification du code cela ne respecte pas entre autres le second principe des principe solide open close principle j'en ai parlé sur ma chaîne youtube je vous mets le lien attaché en ressource à cette vidéo ici en l'occurrence on va faire évoluer notre classe opération pour rajouter le concept d'abstraction d'une parce que en effet une opération comme on l'a dit dans les vidéos précédentes en tant que tel ne veut rien dire il faut une opération spécifique vu que ici dans la calculatrice sinon c'est une opération non reconnue et d'autre part nous allons mutualiser cette méthode exécutée qu'on a implémenté un peu partout mais qui n'est pas défini au niveau d'opération afin de s'assurer qu'on puisse le faire au niveau d'une opération dans le but encore une fois de simplifier notre code commençons sans plus attendre sur la classe opération rendonsla abstraite abstraite veut tout simplement dire qu'il ne sera plus possible de faire opération O est égale à New opération mais alors attention il sera toujours possible de faire opération O est égale à new addition new soustraction ou n'importe quelle autre classe concrète quand bien même cette dernière hérite d'une classe abstraite la classe abstraite est la définition d'un contrat de base qui va permettre de mutualiser du comportement on va s'en servir massivement dans cette vidéo et on va donc empêcher de créer une instance de cette classe-là mais toutes les classes qui en hérit peuvent être de leur côté soit concrète soit abstraite donc une opération n'a pas de sens en tant que tel ce n'est qu'une définition contractuelle de quelque chose qu'on peut faire qu'on peut exécuter je vais donc rajouter ici le mot-cé abstract ce qui la rend donc abstraite vous remarquerez d'ailleurs que cela ne crée aucune erreur de compilation dans mon application car en effet ici ma classe addition n'est pas marquée comme abstract et l'érit d'opération elle redéfinit le constructeur et oui ça peut sembler un peu paradoxal mais une classe abstraite peut définir un constructeur constructeur qui ne sera appelé que par les classes phi et non pas de l'extérieur la preuve en est si je me mets ici et que je fais opération est égale à New donc le New raccourci équivalent de New opération comme ceci j'ai dorénavant une erreur de compilation impossible de créer une instance du type abstrait opération ce qui veut bien dire que ce n'est que la définition d'un contrat et non pas quelque chose d'exploitable et voilà donc un problème de résolu en théorie on devrait pas avoir dans notre calculatrice de else ici mais on va donc résoudre le problème de cette collection de if else if du fait que on doit tester si l'opération est de tel type ou tel type il serait beaucoup plus intéressant d'avoir la méthode exécuté comme ceci au niveau de l'opération se pose cependant deux problème le premier est déjà que vous remarquez assez facilement que tous les fichiers représentant une opération sont en jaune ce qui indique donc un warning si je vais voir dans la classe addition je peux voir que la méthode exécutée est soulignée en jaune et quand je laisse le curseur on a un message qui peut paraître un petit peu cryptique la méthode exécutée définie dans la classe addition cache le membre hérité exécuté de la classe opération si vous souhaitez vraiment le cacher donc si c'était voulu utiliser le motcé New alors effectivement dit comme ça ça s bizarre parce que à votre niveau d'apprentissage le mot new est utilisé pour faire une nouvelle instantiation d'une classe en fait il a d'autres usages et l'un d'entre eux est de dire si dans une classe fi j'ai exactement la même méthode que dans une classe mère mais que dans la classe mère cette méthode n'a pas été définie comme pouvant être overriidé redéfin je peux utiliser le mot clé new pour dire dans ma classe F que c'est une nouvelle méthode qui va cacher la méthode de la classe mère à l'appel c'est simplement un warning parce que dans les faites ici c'est déjà le cas mais pour le rendre explicite on rajoutera simplement ici le motcé New comme ceci ce qui aura pour effet de faire disparaître le warning parce que en effet le compilateur ne sait pas si vous souhaitiez vraiment masquer la méthode de votre hiérarchie ou si c'était une erreur et si c'est une erreur dans ce cas-là mieux vaut la corriger si c'était voulu dans ce cas-là mieux vaut le spécifier à l'aide du mot clu comme c'est affiché ici à l'écran cependant nous ce n'est pas ce qu'on veut faire ce qu'on veut faire c'est dire tout simplement dans la classe de base opération qui est une classe abstraite il y a une méthode exécuté et chaque classe fi qui va hériter de la classe opération doit redéfinir cette méthode exécuté donc ici on va rajouter le mot clé abstract pour définir que exécuter est abstraite une méthode abstraite ne contient pas de corps donc je rajoute pointvgule sans mettre d'acolate comme ceci en bref dans ma classe opération qui est une classe abstraite j'ai pu définir une méthode abstraite à noter que si ma classe opération n'était pas abstraite le mot clé abstract n'est pas valide dans une classe normale par contre si je souhaite quand même définir un comportement de base et que je souhaite que d'éventuelles classes qui hérite de moi puisse redéfinir ce comportement dans ce cas-là on va utiliser le mot-cé Virtual pour dire que c'est une méthode virtuelle et comme ça les méthodes dans les classes fi peuvent overriider cette méthode exécutée donc ici on va rester sur une classe opération qui dans la logique est abstraite et on va définir exécuter comme étant une méthode abstraite alors pourquoi définir exécuter comme une méthode abstraite et non pas comme une méthode virtuol qui n'a pas de corps pour la simple et bonne raison que si si je décide de créer une nouvelle opération par exemple ici je vais créer l'opération puissance cette classe hérite de la classe opération j'ai bien entendu une erreur de compilation Visual Studio code me demande de générer le constructeur mais aussi d'implémenter la classe abstraite choix que je n'avais pas avant donc si je génère le constructeur je ne résous pas tous les problèmes de compilation parce qu'il m'en reste un qui est d'implémenter la classe abstraite en bref c'est un implémentation de la classe abstraite c'est simplement de dire quand j'érit d'une classe abstraite je suis obligé de redéfinir le corps de chaque méthode abstraite et si je clique dessus on peut voir que Visual St code me génère la méthode exécutée mais avec un mot-clé particulier qui est le mot-clé override pour dire qu'il s'agit ici de l'implémentation de la méthode exécutée qui a été défini dans la classe opération mais dont le contenu et ce qui m'intéresse et au niveau de la classe puissance donc ici on va faire résultat est égal à opérante gauche puissance opérant droite comme ceci et donc j'override la méthode exécutée maintenant je vais copier ce mot cl override pour aller le coller ici parce qu'en effet j'ai une erreur dans ma classe addition vous voyez je n'ai pas le mot clé override j'ai donc une erreur de compilation addition n'implémente pas le membre abstrait exécuté en fait elle le fait mais ce n'est pas explicite et ici j'ai de nouveau le même erreur en disant si c'est vraiment un override que tu voulais faire et non pas un masquage utilise le mot clé override sinon utilise le mot cl new mais vu que j'ai ride d'opération et que cette méthode est abstraite je n'ai pas le choix de l'overriider il me reste juste à faire cela dans toutes les classes de toutes mes opérations pour résoudre tous les problèmes de compilation comme ceci à partir de là la question c'est en quoi cela est-il intéressant et bien en fait le fait d'avoir défini au niveau de notre classe opération un comportement que toutes les classes fi sont obligé de redéfinir fait que on est certain que toutes les classes fi d'une opération ont défini de façon concrète la méthode exécutée même si elle ne fait rien vu qu'elle est void ici on a la certitude qu'il y a une implémentation alors remarquez que quand je l'ai implémenté avec puissance j'ai eu un renvoi d'exception méthode non implémentée donc dans le pire des cas si le développeur n'a pas fait son travail cet appel à la méthode exécutée va faire une exception mais elle est obligatoirement implémentée d'une façon ou d'une autre en quoi cela est-il intéressant et bien on va de nouveau profiter du polymorphisme ici au niveau de notre calculatrice on n'est donc plus obligé maintenant d'aller dire est-ce que mon opération est une addition et donc un type concret pour aller appeler exécuter ça marche encore mais comme je l'ai dit la problématique avec ça c'est qu'on a un système fermé comme vous le voyez ici j'ai rajouté la puissance en tant qu'opération mais n'apparaît pas dans la liste je serai obligé de faire un else if sinon je vais tomber dans le cas opération non reconnue pourtant elle existe donc ce qu'on va faire c'est qu'on va simplement supprimer tout ce pattern matching et on va faire opération point exécuter comme ceci et oui la méthode exécutée est définie sur l'opération et chaque classe fille la redéfinit obligatoirement on a donc extrêmement simplifié le code de notre calculatrice mais on l'a rendu ouvert à l'extensibilité parce que chaque opérateur qu'on va rajouter qui va hériter de la classe opération va automatiquement être compris par la calculatrice dès lors qu'elle récupère une opération en paramètres et qu'elle choisit de l'exécuter il faudra juste au niveau de l'opérateur implémenté redéfinir la façon don le résultat est calculé maintenant au niveau de notre programme cela ne change rien l'opération ici est la classe mère dans laquelle je range une classe concrète et que je passe à ma calculatrice mais le résultat est maintenant beaucoup plus simple à lire au niveau de la calculatrice qui devient extrêmement simple et devient d'ailleurs même un simple raccourci vers la classe opération lançons notre application pour vérifier que tout cela fonctionne bien 20/ 5 est bien égal à 4 donc tout fonctionne très bien j'ai donc bien une calculatrice qui prend en paramètre une opération dans laquelle je range de façon concrète une division et au niveau de la calculatrice j'appelle la méthode exécuté qui se trouve être la méthode exécutée abstraite de l'opération mais vu que je suis ici sur une division si je vais dans la classe division j'ai bien l'overde de la méthode exécutée de la classe mère par la classe division qui spécifie comment je dois l'exécuter on a donc d'une part protégé notre code pour éviter qu'une opération qui est totalement abstraite ne puisse être instancier et d'autre part mutualiser le concept d'exécution dans la classe mère afin de permettre de simplifier le code de la calculatrice et donc de rajouter si on le souhaite de nouvelles opérations très facilement dans notre application il restera bien entendu à définir au niveau du programme ici comment est-ce que on veut représenter le signe de la nouvelle opération et refaire un IF else if ce menuà de son côté lui est un système fermé parce que l'opérateur doit être interprété il y a des moyens très avancés de faire ça de façon automatique mais pour le moment je préfère rester simple donc si vous avez réussi cet exercice félicitations vous avez compris et maîtriser le principe de l'abstraction que ce soit au niveau de la classe ou au niveau de la méthode et vous avez donc pu profiter de tous les avantages de l'héritage et du polymorphisme pour mettre en commun un comportement afin de simplifier le code si vous n'avez pas réussi je vous invite vivement à revoir cette vidéo parce que ce concept est très important et pourra comme vous l'avez vu dans la vidéo vraiment simplifier et optimiser le code que vous allez produire il est maintenant temps de voir un sujet qu'on a abordé de multiples fois mais on n pas été dans le détail je veux parler des portées j'en ai parlé plusieurs fois notamment quand on a rencontré le motcé public pour la première fois et puis souvent j'en ai reparlé mais sans aller dans le détail et bien c'est le moment qu'est-ce qu'une portée et bien une portée est un mot-clé qui va définir la visibilité de quelque chose que ce soit une classe une méthode ou une donnée et cette donnée peut être tout aussi bien une propriété comme un membre en fait on a déjà travaillé avec les portées sans le savoir et je vous ai montré dans une démo comment générer une propriété complète avec le motcé prop full et vous avez vu une seconde portée il faut savoir qu'il existe six portées disponibles en cécharpe et tout laisse à penser que vous allez surtout en utiliser trois d'entre elles voire peut-être quatre mais cette vidéo se veut être également est une vidéo de référence avec laquelle vous pouvez revenir si jamais vous avez besoin d'utiliser une portée un petit peu plus particulière afin d'être sûr d'avoir toutes les informations voyons tout d'abord la première portée c'est celle qu'on a vu jusqu'à présent c'est le mot-cé public qu'on va mettre devant une classe méthode ou une donnée et ce mot-cé public indique que la chose en question est visible par tous et n'importe où c'est-à-dire qu'en fait une fois que quelque chose est défini publiquement il n'y a personne qui ne peut pas le voir c'est-à-dire que les autres classes dans des espaces de nom ou dans le même espace de nom vont pouvoir voir l'information les autres classes dans des autres projets vont pouvoir voir l'information bref n'importe qui qui a connaissance du type a accès aux données et à tout ce qui est public c'est on va dire la portée la plus permissive et aujourd'hui on a utilisé celle-là pour pas avoir de souci à contrraire de public on va avoir la portée private qui elle est l'extrême opposé de public à savoir c'est visible uniquement à l'intérieur de la classe c'est-à-dire que private ne va s'utiliser généralement que sur une méthode ou une donnée et rarement sur une classe ça n'a pas de sens sur une classe en fait quand vous déclarez quelque chose comme étant privé ça veut dire que uniquement les éléments définis au sein de la même classe il auront accès par exemple c'est très commun d'avoir une méthode qui est privée qui contient uniquement quelque chose dont on veut appeler depisateur de la classe ou même un membre qui est privé et une propriété se charge de renvoyer et d'affecter la valeur de ce membre c'est d'ailleurs exactement comme ça qui est codé le snipet propf qui vous met un membre privé et une propriété publique c'est quelque chose de très courant comme pattern d'avoir quelque chose de privé ensuite nous nous avons la portée internal alors internal c'est en quelque sorte publ mais uniquement dans le même projet c'est-à-dire que si vous décrivez quelque chose une classe ou autre comme étant internol à la place de public ça veut dire que tous les éléments qui sont dans la même dans le même projet au sens les projets c#arp donc là pour le moment c'est imaginons dans la même application et bien ils pourront le voir par contre si vous avez décidé de faire ce qu'on appelle une bibliothèque on n pas encore eu l'occasion de le faire on va y venir c'est-à-dire que vous créez une dll un un fichier DLL qui contient vos classes et votre code qui est réutilisable dans d'autres projets et bien le fait d'avoir mis quelque chose comme internol dans votre DLL ne va pas autoriser à ce que les autres projet a accès à cette information là en fait c'est la même notion que privé pour faire simple mais au niveau du projet et pas au niveau d'une classe maintenant on vient une portée qui est très intéressante la portée protectide en fait cette portée là c'est un peu l'équivalent de Private mais c'est pour la classe et toutes ces classes fi en gros vous allez déclarer quelque chose comme protectied et ce ne sera visible que par la classe elle-même et toutes ces classes fille et non pas de l'extérieur à l'inverse de Private qui n'est visible que dans la classe elle-même et donc est invisible dans sa descendance donc protectide c'est le Private pour l'héritage ça ce sont je vais dire les quatre portées les plus classiques et celles que vous allez utiliser quasiment tout le temps même si internal vous l'utiliserez pro probablement un peu moins que les trois autres public c'est obligatoire private ça l' tout aussi protective desors que vous faites de l'héritage ou autre vous allez l'utiliser internol ça va dépendre de votre façon de travailler mais en gros ces quatre portés là sont les portés on va dire par défaut standard maintenant j'ai dit qu'il en avait six des portées cela veut dire qu'on a deux portées qui sont un peu différentes et un peu particulière pas d'inquiétude on va revenir sur ces deuxlà en détail dans le prochain slide je vais juste vous les l' présenté ici dans un premier temps la première est protectide internol alors oui c'est bizarre mais c'est la concaténation avec un espace bien sûr des mots clés protecti et internol c'est-à-dire que quand le compilateur rencontre ces deux mots- clés à la suite il sait que c'est une portée à part entière il s'agit de la jonction de protectide et internal et j'insiste bien sur la jonction ce qui veut dire que quelque chose marqué comme protectide internol même si la logique voudrait dire que et bien c'est c'est c'est valide uniquement pour les classes fill qui sont qui sont créé dans le même projet ce n'est pas ça c'est pour c'est une portée qui permet de voir quelque chose dans les classes fill et dans le même projet parce que rien n'empêche d'avoir une classe fille qui serait dans un autre projet si vous avez défini votre classe mère dans un projet a et vous créez un projet B qui importe le projet a vous pouvez très bien dans votre projet B créer une classe fille quiérite de la classe mère qui est définie dans projet a et avec protecting internal ce sera visible parce que c'est la fonction des deux visibilités à l'inverse de ça nous avons private protected et Private protected là on est sur l'union de protected internal c'està-dire la l'Union ce qui se passe entre les deux portées c'est-à-dire que même si je trouve que cette portée porte très mal son nom parce qu'il y a le mot clé private qui est dedans ça veut dire qu'en fait on va avoir une visibilité que pour les classes fill qui sont définies dans le même projet et pas les classes fill des autres projets ce sont deux porter comme je vous ai dit qui sont très particulières et voire même j'aurais presque envie de dire assez compliqué c'est pour ça que j'ai dédié la slide suivante à expliquer ce qui se passe néanmoins si vous voulez aller plus vite et passer cette explication et directement aller à l'exercice sentez-vous libre de le faire parce que encore une fois comme je vous l'ai dit cette vidéo est une vidéo on va dire de référence et à cet effet la connaissance de ces deux porté en particulier n'est pas nécessaire pour l'exercice et n'est pas nécess pour la suite du cours donc sentez-vous libre d' revenir plus tard quand vous vous sentez plus à l'aise avec le langage maintenant voyons un exemple pour les portées protected internal et Private protected nous avons ici deux assemblies une assemblie est un projet au sens c#arp et dans ces deux projets nous avons un ensemble de classes ici j'ai défini dans le projet 1 une classe que j'ai appelé a_ore classe qui contient deux propriétés la première a qui est priv protectit et la seconde B qui est protectit internol au sein de la du même projet il y a une autre classe qui s'appelle b classe qui n'a aucun lien de parenté avec une classe A qui est juste une autre classe à côté et nous avons également a prime class qui hérite de a class au sein du projet 1 dans le projet 2 on a une classe qui s'appelle c class qui n'a aucun lien de parenté et aucun rapport avec la classe A du projet 1 et nous avons D underscore classe qui hérite de la classe A undcore classe du projet 1 donc vous voyez qu'il est tout à fait possible d'avoir une classe dans un autre projet qui hérite d'une classe d'un projet différent maintenant on va commencer par analyser parmi toutes ces classes autre que a classe bien sûr lesquelles peuvent voir A B ou les deux on va commencer par le cas le plus simple c'est-à-dire c class étant donné que c _ class est défini dans le projet numéro 2 et qu'il n'a aucun lien de parenté avec a class il n'a il ne voit rien du tout c'est-à-dire que si dans C andersore class nous avons une instance de a andersore class et bien il n'aura accès ni à la propriété a ni à la propriété B c'est le cas le plus simple maintenant voyons un autre cas extrêmement simple qui est a Prim onoscore class et bien lui verra tout simplement les deux car il s s'agit d'une classe F qui est dans le même projet donc par définition la propriété B qui est protecttide ou internal il la verra car il est dans sa hiérarchie et donc il aura accès à B par le biais du motclé protectide et il aura également accès à la propriété a du fait que private protected définit les classes fi dans le même projet donc a prime classe aura accès à A et B maintenant voyons le cas de d core class et bien lui ne verra que B et non pas a car B est la jonction de protecti et internol et donc étant donné que d en d'utre classe est un héritage de a enore class et bien il va pouvoir voir B par le biais du mot clé protectide cependant la portée private protecttite implique que l'héritage soit fait au sein du même projet et c'est pourquoi dans la classe D nous ne voyons pas la propriété a maintenant pour terminer dans la classe B qui est dans le projet 1 elle ne verra que B en effet il n'y a pas de lien hiérarchique entre la classe B et la classe A ce qui veut dire tout simplement que le Private protectde ne peut pas être accessible du fait que ce n'est que pour les classes fi dans la même dans le même projet et vu qu'il n'y a pas de lien de parenté elle ne peut pas voir cette propriété là cependant concernant la propriété B étant donné que celle-ci est protectide et internol car la classe B se trouve dans le même projet et donc dans la même assemblée elle utilisera le mot-cé internol pour aller accéder à la propriété B voilà l'explication de la différence de ces différentes de ces deux portées un petit peu particulières donc c'est quelque chose de très pointu et que vous n'allez pas utiliser souvent voir même jamais au début de votre apprentissage il faut juste savoir que ces dernières existent qu'elles sont à votre disposition et qu'elles se comportte comme cela n'hésitez pas à revoir cet exemple afin de bien comprendre la différence maintenant il faut savoir qu'il est possible d'appliquer une portée sur une propriété de façon son très précise souvenez-vous une propriété a deux mots clés get et set en en vérité get et set sont en quelque sorte deux méthodes qui vont nous permettre la lecture et l'écriture on est dans la capacité de dire et bien la lecture et où l'écriture est moins permissive que la PROE que la portée générale qu'est-ce que cela veut dire et bien imaginons que j'ai une propriété publique public string ma propriété et j'ai un getter et un setter mais je souhaite que l'écriture ne puisse se faire que depuis l'intérieur de ma classe et bien dans ce cas je peux appliquer une portée directement au mot clé 7 en l'écrivant avant le motcé 7 par exemple public ma string ma propriété j'ouvre les acolades getvule private set avec un espace entre private et set me permet de définir que le setter est privé et donc que cette propriété ne peut être écrite que depuis l'intérieur de ma classe je peux faire exactement pareil sur le GET la seule règle à respecter c'est que si j'applique une portée sur le Getter ou le Setur elle doit être moins permissive et donc plus restrictif que la portée générale je ne pourrais pas avoir private string ma propriété ouvre les acolat public get public set ça ne marchera pas parce que le Getter et le setterter seraient donc beaucoup plus permissif que la propriété elle-même et ce serait incohérent pour terminer sur la notion des portées par rapport aux propriétés on peut créer une propriété en lecture seule c'est-à-dire que la valeur qu'on va stocker dans cette propriété ne peut être définie qu'au moment où est-ce qu'on va créer la classe à la construction pour se faire il suffira simplement de supprimer le mot clé 7 c'est-à-dire que nous aurons une propriété publque ma string ma propriété entracolate get pointvule et il n'y aura pas de Setur attention une propriété en lecture seule est bien différente d'une propriété avec le Setur qui est privé j'insiste là-dessus la propriété en lecture seule vous bloquez le fait que cette propriété puisse être écrite plus tard dans la vie de votre classe c'est-à-dire que vous allez définir sa valeur à la construction et la valeur ne changera pas elle sera uniquement accessible en lecture une propriété avec un Setur qui est privé quant à lui peut-être écrit à tout moment de la vie de la classe mais uniquement depuis l'intérieur de votre classe même si vous pilotez l'écriture ça ne change pas le fait que vous pouvez néanmoins la réécrire maintenant qu'on a vu les différentes portées je vous propose un exercice afin de finaliser notre calculatrice on va faire simple on va simplement utiliser toutes les portées qui sont pertinentes pour notre classe de base opération et pour la classe calculatrice afin d'éviter que tout soit publique et que tout puisse être réécrit donc je vous invite à mettre la vidéo en pause à revoir éventuellement certains éléments qui vous paraître encore un petit peu obscur et à tenter cet exercice le but étant que lorsqu'une calcu calculatrice a été créée avec une opération cette opération ne peut pas être changée et lorsqu'une opération a été crée avec des opérandes celle-ci ne peut pas être changée et le résultat d'une opération ne peut être écrit qu'à l'intérieur de la classe opération moi je vous donne rendez-vous dans quelques secondes pour la correction au sein de Visual Studio code comme nous l'avons vu dans les slides juste avant il est tout à fait possible d'utiliser une des portées fournies par c#arp pour rendre certains éléments moins visible depuis l'extérieur si je reprends la classe opération je peux voir ici par exemple que tout est absolument défini en public pour certaines choses cela fait sens comme en l'occurrence le résultat qui est exploité de façon publique tout du moins en lecture la méthode exécutée qui est définie de façon publique pour d'autres par contre ce n'est pas très important voire même très intéressant par exemple est-il nécessaire de pouvoir lire depuis l'extérieur l'opérant de gauche ou l'opérant grand droite d'une opération si ça l'est tant mieux étant donné qu'ici notre propriété est déjà définie comme étant en lecture seu ce qui est déjà une très bonne chose mais dans le cadre de notre exercice il n'est pas nécessaire d'aller lire ces données depuis l'extérieur je vais donc définir que ces propriétés ne sont visibles que par les classes Phi de la classe opération vous vous souvenez de quel mots-clé on doit utiliser pour définir cette portée cette visibilité et oui c'est le mot-clé protectide donc ici je vais définir protectide sur opérant gauche et protectide sur opérant droite ça veut tout simplement dire que ces deux propriétés ne sont visibles que aux class fi et non pas depis n'importe où par exemple si je retourne sur le programme qui est ici et que j'essaie sur mon opération de faire l'affichage des propriétés on peut voir que je n'ai plus que résultat là où avant j'avais opérant gauche et opérant droite qui étit visible en lecture ici elles ne le sont plus vu qu'elles sont dorén avant marqué comme protectide bien entendu si vous décidez d'afficher par exemple ici le résultat de X + y dans le cadre d'une addition est résultat vous devez avoir accès aux opérand pour récupérer la valeur et dans ce cas-là il faut les laisser publiqu donc en faisant ceci on s'évite certains problèmes de la même façon est-ce que le constructeur d'une classe abstraite doit être défini comme publ non il peut-être lui aussi défini comme protectide parce que au final il ne sera appelé que par les classes fi ce n'est donc pas la peine de le mettre public même si au final ça ne change pas grand-chose on peut le mettre protectide afin de manipuler un petit peu les portées maintenant intéressons-nous à la propriété résultat en effet la propriété résultat est définie par la par l'appel à la méthode exécutée qui se passe donc après la construction de notre opération il n'est donc tout simplement pas possible de passer cette propriété comme étant en lecture seule c'est-à-dire en supprimant le set comme ceci cela provoque vous le voyez ici dans la partie gauche des erreurs de compilation si je vais sur addition par exemple je vois que résultat est défini comme lecture seule donc je ne peux pas le définir en lecture seule cependant laisser le set comme ceci accessible fait que ici par exemple après exécuter je peux faire opération point résultat est égal à 0 et ça ne pose aucun problème de compilation c'est bien problématique parce que en effet ça devrait être simplement la responsabilité de l'opération d'affecter le résultat la calculatrice se contente de demander à l'opération de s'exécuter et c'est l'opération qui est responsable de définir le résultat et une fois que c'est fait plus personne ne devrait y toucher alors maintenant comment est-ce qu'on peut faire et bien nous allons utiliser encore une fois le mot clé protectide pour dire que ce n'est autorisé que pour les classes fi mais cette fois on va le définir au au niveau du set comme ceci le set en protectide étant plus restrictif que la portée globale de la propriété qui est publique c'est tout à fait possible de définir un set protectide donc uniquement accessible aux classe fi alors que la propriété elle-même est publique ce qui veut dire que le public va s'appliquer ici sur le GET par contre ce n'est pas possible de faire ceci c'est-à-dire d'avoir une propriété qui est protectide et de définir un getate qui est public on peut le voir j'ai une erreur de compilation qui me dit que le modificateur d'accessibilité la portée sur Get doit être plus restrictive que celle de la propriété donc je ne peux pas faire ceci et dans ce cas-là si je ne mets aucun mot-clé devant le GET ou le set ça prend par défaut la portée de la propriété à partir de là vous pouvez le voir dans le programme.cs j'ai dor en avant une erreur de compilation qui me dit que je ne peux pas définir résultat parce qu'il n'a pas de Setur qui est accessible en effet il n'est pas accessible depuis l'extérieur il est juste accessible depuis les classes fi et d'ailleurs si je vais sur addition je peux voir ici que je peux bien affecter le résultat donc il est tout à fait possible de définir certains éléments plus restrictif et si je voulais être encore plus restrictif je pourrais même utiliser le mot-cé Private qui me dit dans ce cas-là que c'est uniquement au sein de cette classe en particulier bien entendu ce n'est pas quelque chose de valide pour le rés dans le cas présent parce que ici dans addition par exemple résultat n'est pas accessible au class fi vu qu'il a été défini comme private et qu'il s'agit d'un héritage donc pour que ce soit accessible aux class fi il faut bien utiliser la portée protectide cela vous permet donc de gérer finement les accès de qui a le droit de voir quoi et donc d'éviter des erreurs malencontreuse de code ou est-ce que quelqu'un qui n'aurait pas le droit à l'extérieur d'aller modifier une valeur puisse le le faire parce qu'il manque simplement un modificateur de visibilité ou de portée comme c'est le cas ici lançons rapidement l'application pour s'assurer que tout fonctionne toujours très bien 10 + 10 est é= à 20 20/ 20 c'est la note que vous avez si vous avez réussi cette exercice parce que les portées en c#arp sont quelque chose d'essentiel et de central pour faire du code propre maintenable et sécurisé si vous n'avez pas réussi cet exercice je vous invite vivement à recommencer parce qu'il n'est pas du tout recommandé de se contenter de tout passer en public qui est donc la portée la plus permissive cela pourrait créer bien des problèmes dans vos applications si vous avez donc réussi cet exercice félicitations on peut maintenant passer à un concept un petit peu plus compliqué la notion d'interface alors on va commencer sans plus attendre avec la notion d'interface et attention il s'agit bien d'interface en programmation orientée objet et non pas d'interface graphique ici l'interface au sens programmation orientée objet est un petit peu particulière par rapport à ce qu'on a déjà vu notamment par rapport à la notion de classe abstraite en c#arp il n'est pas possible d'hériter de plusieurs classes c'est pourquoi si on veut définir un comportement commun différent dans deux classes différentes et qu'on décide de faire deux classes abstraites différentes on ne va pas pouvoir créer une classe qui hérite de deux classes abstraites c'est impossible c'est possible dans un langage comme C++ mais c#arp ne l'autorise pas donc on se retrouve un peu démuni dès lors qu'on veut avoir différents comportements et avoir différentes abstractions qui représentent ces différents comportements une stratégie et de tout regrouper dans une seule classe abstraite heureusement la notion d'interface nous aide à profiter de tout ce que le polymorphisme offre comme avantage je rappelle je rappelle rapidement le polymorphisme vient de PO pomorphe plusieurs formes ce qui veut dire que votre classe peut être considéré comme plusieurs types différents du fait qu'une classe implémente une interface elle peut être considérée comme étant une instance de ce type d'interface en particulier pas d'inquiétude ça va très vite vous sembler un peu plus clair donc à la base et je parle bien de à la base dans les toutes premières versions de c#arp et généralement en POO une interface est une déclaration de contrat c'est-à-dire qu'on va simplement lister les méthodes et les propriétés que que la classe qui implémente cette interface doit définir obligatoirement dans son instance et dans une interface de contrat on ne fait que définir la signature de ce qu'on attend donc les éléments sont définis de façon 100 % abstrait c'est-à-dire sans corps cependant cela a changé avec les dernières versions de carp et comme à chaque fois l'idée ici est de vous montrer l'évolution du langage depuis le babas jusqu'au dernière version pour que vous puissiez faire votre choix en fonction de ce que vous savez alors une une interface va nous permettre de déclarer des éléments d'instance qu'une classe qui l'implémente doit définir j'insiste sur élément d'instance on va voir dans la prochaine vidéo est-ce qu'on va parler du statique que depuis carpe 11 il y a eu un changement notable à cet effet mais carpe 10 et avant c'était forcément des éléments d'instance qu'est-ce que ça veut dire et bien ça veut dire que l'interface définit des choses qui se trouvent sur une classe qui doivent être instanciés c'est-à-dire avec le mot clé new donc on ne peut pas définir de choses qui sont statique et si ça ne vous parle pas dans la prochaine vidéo j'irai plus loin sur le statique pour que vous puissiez comprendre de quoi il en retourne donc pour l'instant on va rester sur cette définition simple qui est valide pour c#arp 10 et les versions d'avant et dans la vidéo suivante on verra ce que c#arp 11 a changé donc une interface déclarer des élément d'instance méthode ou propriété c'est-à-dire que dès que vous déclararez dans une interface void ma méthode et bien la classe qui implémente cette interface doit définir la méthode void ma méthode par convention en c#arp vous allez nommer vos interfaces avec un I majuscule i mon interface pour l'interface qui s'appellerait mon interface pourquoi est-ce qu'on fait ça et bien simplement parce que c'est une convention qui est là depuis très longtemps et parce que le i vient donc de interface et que ça permet également de suivre ce que le framework fait par exemple iumérable l'interface iumérable commence par un I majuscule et la totalité des interface dans le framework respecte cette convention donc je vous invite vraiment à respecter les conventions de nommage c#arp pour que votre code colle à celui qui est produit de façon officielle par Microsoft on peut donc définir des méthodes ou des propriétés et c'est important de ne pas mettre de porté bon j'ai fait quand même beaucoup de théories sur l'interface il est temps de voir un peu de code voici comment on déclare une interface nous avons donc une interface qui est déclarée de façon publique on peut effectivement mettre la portée devant le nom de l'interface pour dire si elle est publique internol ou ainsi de suite on a donc le respect ici de la convention i mon interface et on voit dans le corps de l'interface qu'on a la définition d'une méthode faire quelque chose et d'une propriété ce qui est important c'est que que ce soit pour la méthode ou pour la propriété il n'y a pas de porté qui est définie ce n'est pas public void faire quelque chose ni public in propriété pourquoi et bien parce que votre interface va nécessiter que votre classe implémente des éléments d'instance et selon la portée de votre interface vous allez définir la portée de la façon dont vous l'implémentez dans votre classe généralement c'est ique donc dans l'interface on ne met pas de portée parce que c'est la responsabilité de la classe qui implémente l'interface de définir la portée encore une fois généralement c'est public et on remarquera ici que c'est intéressant c'est que on a pour la méthode faire quelque chose le même type de syntaxe que pour une méthode abstraite dans une classe abstraite ça veut dire qu'on a un pointvgule à la fin on a donc pas d'acolade et il n'y a pas de corps par contre ici pas besoin d'utiliser le mot-cé abstract on définit simplement le type de retour le nom de la méthode et ses paramètres et on met pointvgule encore une fois c'est un contrat pour les propriétés c'est un petit peu plus particulier parce qu'on doit spécifier si on veut que la propriété soit implémenté en lecture en lecture écriture en écriture seu je vous avoue que j'ai très rarement vu des propriétés implémentées en écriture seul c'est-à-dire que entre les acolades après le nom de la propriété on a uniquement se le GET est très courant ça veut dire que contractuellement votre interface doit exposer une propriété de type int qui s'appelle propriété avec un accesseur public en ure après l'écriture peut-être fait de la façon dont vous le souhaitez soit par le biais du constructeur soit par le biais d'un setteur qui est privé si je décide d'implémenter cette interface j'ai juste ça à faire c'est-à-dire que je vais créer une classe qui implémente cette interface et après le de POS je mets mon interface ou mes interfaces si on va en mettre plusieurs on va les séparer par des virgules et visu studio va simplement nous dire ok mais il faut que tu l'implémentes et donc grâce à la petite ampoule il va automatiquement récupérer les informations depuis les interfaces pour créer les éléments dans votre classe donc ici on voit ma classe classe interface implémente i mon interface et donc elle doit définir la méthode faire quelque chose et implémenter la propriété de type int qui s'appelle propriété avec un accessoire en lecture donc ici dans le code qui est affiché à droite on a choisi de renvoyer une valeur constante en lecture seule sans avoir la possibilité de la redéfinir autrement donc c'est assez simple de créer une interterface c'est également assez simple de implémenter et avec les outils comme Visual Studio ça va très vite pour faire l'implémentation automatique maintenant comme je l'ai déjà dit une classe peut implémenter plusieurs interfaces et une interface peut elle-même hériter d'une ou plusieurs autres interfaces en fait c'est encore une fois le polymorphisme qui va vous permettre de créer ce jeu d'héritage et va donc vous donner la possibilité d'avoir une grosse flexibilité sur les types que vous allez créer ici on peut avoir une classe qui implémente plusieurs interfaces par exemple je je vais donc définir une interface i animale une interface i mammifère et quand je fais une classe chien et ben le chien a les caractéristique d'un animal et également d'un mammifère bien sûr on aurait pu également dire ici que mammifère implémente l'interface i animale les interfaces sont définies ici de façon vide mais c'est simplement pour vous montrer comment une classe peut implémenter plusieurs interfaces on les sépare uniquement par une virgule le corps de chaque interface et de chaque classe dans le code affiché à l'écran est simplement vide c'est pour ça que j'ai des acolates vide à la fin parce que je n'ai pas défini de méthode ni de propriétés dans aucun des éléments que j'ai créé ici à l'écran donc vous êtes libre de faire l'implémentation comme vous le souhaitez et donc la classe chien qui implémente ces deux interfaces on pourra avoir une variable de type I animal qui contient donc un chien une variable de type I mammifère qui contient un chien ou une variable de type chien qui contient un chien c'est l'avantage du polymorphisme et donc le fait qu'on puisse avoir des variables de ces types plus génériques vous verrez vous pratiquerez créer cela durant l'exercice ensuite on peut créer une hiérarchie d'interface si on a envie c'est très simple on définit une interface et puis pour dire qu'une interface implémente ou hérite d'une autre on garde la même syntaxe que quand on le fait pour l'implémentation pour une classe de point le nom de l'interface et si on veut en mettre plusieurs on met par des virgules donc en fait vous avez là en face de vous un système vraiment très flexible pour permettre de créer des objets à qui ont de multiples facettes maintenant je vous avais dit dès le début que on définit dans l'interface que des contrats c'est-à-dire des méthodes qui n'ont pas de corps qui ne sont donc pas concrètes de telle sorte que les classes qui implémentent l'interface doivent définir ces méthodes c#arp 8 a un petit peu changé la donne car en effet depuis c#arp 8 on peut proposer dans une interface une implémentation par défaut des nouvelles méthodes qu'on va rajouter alors pourquoi ça a été fait je vais vous donner un exemple très simple vous créez une librairie dans laquelle vous exposez une interface i mon interface qui contient par exemple trois méthodes cette librairie est utilisée dans beaucoup de projets dans votre société ou même dans votre projet et vous décidez que il faudrait idéalement rajouter une 4ème méthode à cette interface bien que cela généralement est plutôt du genre à casser les principes solides notamment le principe au open close principle j'en ai parlé sur ma chaîne youtube si ça vous intéresse et bien c'est des cas qui peuvent arriver notamment s'il y a un bug ou s'il y a vraiment une nécessité de faire évoluer laapi dans ce cas-là et bien qu'est-ce qui va se passer vous allez créer une nouvelle méthode de contrat dans votre interface et tous les éléments qui implémentaient cette interface auront dorén avant une erreur de compilation ce qui va être très dommage donc en ccharp 8 ils ont prévu le fait qu'on puisse créer une nouvelle méthode dans notre interface et lui donner une implémentation par défaut donc on quitte un petit peu juste le contrat on va un peu marcher sur les plates bandes de la classe abstraite c'est quelque chose qui est assez controversé selon certaines personnes qui sont adeptes de la POO pure mais qui peut être très pratique moi je n'utilise jamais cette approche mais je tenais quand même à vous la présenter pour que vous soyez au courant qu'elle existe en fait on va simplement écrire la méthode dans notre interface ici j'ai mis à l'écran une interface eloger qui avait donc à la base uniquement la méthode log on va partir de ce principe là donc void log avec un message et on a décidé qu'on aimerait bien également loger un message d'erreur avec une exception donc on veut créer une nouvelle méthode log error qui contient le message et l'exception et bien la problématique qu'on va avoir c'est que si on ne fait que créer la méthode de contrat log error message exception pointvule et bien tous les logur qui implémentent notre interface vont devoir redéfinir cette méthode et l'implémenter donc pour éviter qu'on casse le comportement qui existe déjà on crée une implémentation par défaut il y a également une autre raison d'utiliser l'implémentation par défaut c'est de dire je crée une interface avec ces méthodesl et si tu n'as pas envie de te prendre la tête j'ai déjà mis une implémentation par défaut dedans je je suis très peu adepte de cette pratique il faut savoir qu'elle existe je trouve que ça casse un peu le concept d'interface de contrat on est presque sur une classe abstraite sans avoir les bénéfices de la classe abstraite mais quoi qu'il en soit ça existe et voilà comment on le fait donc si je crée une classe loger qui implémente l'interface eoger le compilateur va me forcer à implémenter la méthode log avec message et Visual Studio me le dira également mais la méthode log error sera passée sous silence et donc je je serais obligé d'aller l'implémenter par moi-même on va revenir sur ça dans la prochaine slide point important avant de passer il reste impossible d'instancier une interface ça veut dire que même si ici j'ai des méthodes qui sont concrètes avec une vraie implémentation dans mon interface je pourrais même si je le souhaitais faire une interface qui n'a que des implémentations par défaut je ne peux jamais faire mon interface est égale à New mon interface car c'est un type totalement abstrait quand bien même des implémentation par défaut sont mis dedans le compilateur fait juste le travail à votre place de faire descendre automatiquement l'implémentation par défaut l'implémentation par défaut a quand même quelques différences avec celle d'une classe abstraite on en a parlé brièvement dans la slide précédent je vais revenir dessus déjà on ne doit pas utiliser le mot clé override pour substituer l'implémentation donc dans l'exemple précédent si je fais un logger qui implémente eloger si je veux redéfinir la méthode log error je n'ai pas besoin de mettre override devant comme ça peut être le cas avec les méthodes à abstrait dans les classes abstraites ensuite il n'y a pas la possibilité d'appeler la méthode qui est définie dans l'interface si on la redéfini quand on fait l'override d'une méthode qui a été marquée comme virtual par exemple avec une classe de base on peut toujours faire base point la méthode pour rappeler la méthode et le corps de la méthode qu'il y avait défin dans la classe de base ici le mot clé base n'existe pas on implémente une interface on n'hérite pas d'une classe et donc je ne peux pas dire je vais remplacer l'implémentation par défaut de l'interface avec la mienne mais je veux quand même appeler celle de l'interface le remplacement est définitif et remplace tout donc soit vous ne remplacez rien soit de vous remplacez tout il n'y a pas la possibilité de combiner avec ce qui existait déjà ensuite la redéfinition de la méthode implique de connaître comment l'interface a été créée car vu qu'on na pas le mot-cé override on n'aura pas une liste fournie par Visual Studio qui va nous aider à trouver le nom de la méthode on la trouvera quand on va commencer à taper public suivi de par exemple void log error on va la trouver dans la liste mais vous n'avez pas le moyen facile dans vs code tout du moins d'avoir la liste des méthodes définies avec une implémentation par défaut dans l'interface et pour finir une interface n'a pas de constructeur il est donc impossible de forcer certaines informations à la création c'est très important c'est que si vous souhaitez dire quand j'érite de cette classe je veux absolument renseigner telle valeur telle propriété même avec l'implémentation par défaut des interfaces c'est impossible il faut passer par le constructeur d'une classe abstraite qui force le fait qu'on doit faire véhiculer l'information ça sort un petit peu du cadre de l'implémentation par défaut mais c'est une grosse différence avec les classes abstraites donc vous avez ici un tour assez complet des interfaces surtout pour c#arp 10 et avant on verra dans la prochaine vidéo quand on abordera le statique ce que cécharpe 11 a changé par rapport au statique et comme à chaque fois pour pas que ça reste abstrait c'est bien le mot qui va bien pour cette vidéo je vous propose de faire un exercice c'est cet exercice sera le suivant on va utiliser le concept d'interface et de polymorphisme c'est-à-dire qu'au lieu d'avoir une interface de contrast simple on va se servir d'une variable de type interface comme on l'a fait pour la classe abstraite cette interface va nous permettre de mettre en commun tous les éléments d'une opération qui sont censés être publ et commun notamment la méthode exécuté et la lecture de la propriété résultat j'insiste sur la lecture on n pas envie de mettre l'écriture dans la vidéo précédente on a fait en sorte que le résultat ne puisse être défini que par les classes fi si on définit dans notre interface de contrat l'écriture comme étant contractuelle par l'interface cela deviendra de fait public et ce n'est pas ce qu'on veut on va donc aller modifier notre classe abstraite opération pour qu'elle implémente l'interface et on va modifier le code du programme.cs et de la calculatrice pour utiliser l'interface au lieu de la classe abstraite car en effet même si la classe abstraite apporte des avantages il est toujours plus intéressant à un niveau objet de véhiculer l'interface de contrat plutôt qu'une implémentation quand bien même cette dernière est abstraite je vous laisse donc revoir la vidéo si nécessaire et je vous retrouve dans quelques secondes pour le corriger dans Visual Studio code au cours des vidéos précédentes nous avons fait évoluer notre calculatrice pour créer notamment la classe de base opération et cette classe A beaucoup changé elle est passée d'une classe concrète à une classe abstraite afin de mutualiser un certain comportement c'est d'ailleurs là tout l'intérêt d'une classe abstraite ou non qui sert de classe mère à d'autres classes c'est de mutualiser un comportement qui est commun bien que comme je l'ai dit dans les slides avec les toutes dernières versions de cécharp il est possible de mutualiser ou tout du moins d'avoir un comportement par défaut au sein des interfaces c'est globalement reconnu comme étant une pratique à éviter et une interface doit servir de contrat dans l'immense majorité des cas qu'est-ce qu'un contrat de programmation c'est simplement la garantie que tout ce qui va implémenter cette interface dispose de ces éléments de plus comme je l'ai dit dans les slides et je tiens à le rappeler en c#arp il est tout bonnement impossible d'hériter de plusieurs classes alors qu'il est tout à fait possible d'implémenter plusieurs interfaces il sera donc judicieux et intéressant de créer de multiples interfaces et éventuellement d'avoir une classe qui implémente plusieurs interfaces pour répondre à plusieurs contrats dans le cadre de notre calculatrice nous allons créer une interface de contrat pour une opération mathématique qu'y a-t-il dans ce contrat comme cela a été dit dans la slide d'exercice il y a deux choses qui sont contractuelles la lecture du résultat et la présence de la méthode exécuté je vais donc sans plus attendre rajouter ici une interface donc je vais choisir non pas classe cette fois-ci mais bien interface et pour respecter la convention de nomage je vais l'appeler i opération toutes les interfaces en c#arp par convention commence par un I majuscule je fais donc entrer je corrige l'espace de nom et je suis prêt à commencer à créer mon interface comme on peut le voir au lieu d'avoir ici le mot clé classe on a le motclé interface ce qui implique par définition qu'il sera tout à fait impossible d'instancier une interface par exemple si ici dans mon programme je définis une opération comme ceci on peut voir que je peux la déclarer mais je ne peux pas faire de New dessus vous pouvez le voir qu'il est impossible de créer une instance d'un type abstrait comme on l'avait précédemment avec la classe abstraite opération ou d'une interface à l'instar de ce qu'on a fait avec la classe abstraite on va pouvoir y ranger un type concret mais on ne pourra pas l'instancier très bien maintenant revenons à la définition de notre interface comme on l'a dit elle va définir le contrat que chaque op doit respecter ce qui veut tout simplement dire que à n'importe quel endroit dans mon code quand j'auraiis une variable de type I opération donc qui implémente l'interface iopération je suis certain que derrière il y a un type concret qui va respecter ce contrat donc au niveau de la calculatrice je vais avoir besoin de garantir qu'une opération implémente la méthode exécutée et je vais avoir besoin qu'elle expose une propriété résultat en lecture donc au niveau de mon interface je vais définir déjà qu'elle doit avoir une méthode exécutée remarquez que c'est intéressant par définition vu qu'on définit un contrat tout ce qui est défini dedans est défini de façon publique il y a un cas un peu particulier qui est l'implémentation explicite d'interface qui permettrait éventuellement d'avoir des éléments qui ne sont pas publqus au sens large mais c'est un point assez complexe et assez avancé qu'on va volontairement laisser de côté ici donc il n'y a pas besoin de mettre devant de public comme ceci bien que ce soit possible depuis les dernières versions de C sharp il est préférable de simplement décrire qu'est-ce que cette méthode attend donc le type de retour le nom de la méthode de contrat et les éventuels paramètres et ce sera exactement pareil pour les propriétés je vais définir qu'elle a une propriété résultat avec un get comme ceci remarquez que je n'ai donc pas de public et que on pourrait croire presque ici que c'est une propriété qui est défini directement dans l'interface mais il s'agit simplement de mettre ici le contrat à respecter maintenant que j'ai fait cela au niveau de ma calculatrice je peux donc utiliser non plus une opération mais une i opération et vous remarquerez que cela ne change absolument rien au code de ma calculatrice tout simplement parce que au lieu d'utiliser le type abstrait qui va mutualiser un comportement je vais utiliser le contrat ce qui permettra d'ailleurs éventuellement par la suite d'avoir d'autres types qui vont implémenter ce contrat même sans passer par la classe mire opération éventuellement et je sais que cette opération qui est donc un i opération qui a respecté le contrat expose la propriété résultat en lecture et la méthode exécutée donc absolument aucune erreur de compilation ici au niveau de ma calculatrice par contre au niveau du programme ici on peut voir que j'ai une erreur parce qu'il ne peut pas convertir la classe de base opération en I opération donc ce qu'on va faire c'est que dans le programme on va dire OK ici c'est une i opération et là se pose d'autres problèmes la classe addition et toutes les classes fi de opération n'implémentent pas cette interface il serait possible d'aller sur addition par exemple et de dire qu'elle implémente l'interface eopération donc ici nous n'avons plus besoin d'utiliser le mot-clé override pour dire qu'on implémente cette méthode d'interface et vous remarquerez qu'il me reste simplement à implémenter résultat je vais revenir en arrière parce que ce qu'on va faire c'est qu'on va profiter de la hiérarchie qu'on a déjà mis en place pour dire que notre classe abstraite elle implémente i opération et comme ceci je résous tous les problèmes de compilation d'un coup pour la simple et bonne raison que ma classe abstraite qui définit des comportements de base va implémenter cette interface et va donc exposer non seulement la propriété résultat accessible en lecture et remarquer que je suis obligé de respecter l'interface pour la lecture mais pour l'écriture je suis libre ici j'ai mis protec 7 mais rien dans le contrat ne m'oblige à l'implément d'une façon ou d'une autre donc je dois respecter le contrat initial pour la propriété mais après je peux la dériver en faire une spécification qui est propre à mon implémentation quant à la méthode exécutée je l'ai bien implémenté ici quand bien même elle est faite de façon abstraite ce qui me permet de garder le comportement de dire ok quand on hérite d'opération on doit réimplémenter exécuter et si je regarde dans mon programme je peux voir de rienavant que tout est compatible parce que addition hérite d'OP option et opération implémente i opération donc au final ici je travaille uniquement avec l'interface de contrat en disant que je veux une variable qui respecte ce contrat et je peux donc après l'utiliser librement dans ma calculatrice l'interface nous sert à ça à définir les bases d'un contrat que tout le monde doit respecter et vous avez donc ici la hiérarchie la plus complète en partant d'une interface de contrat qui est implémenté initialement par une classe abstraite et ensuite nous avons des classes concrètes qui héritent de cette classe abstraite trite et redéfinissent la méthode concernée à partir de là tout fonctionne très bien je vais rapidement lancer ma calculatrice pour m'en assurer on peut voir que 10 + 10 fait toujours 20 ça fonctionne exactement comme avant alors une petite note avant de clôturer cette vidéo le fait de définir une interface fait qu'on peut l'utiliser dans de multiples classes et il n'est en aucun cas obligatoire bien entendu de passer par une classe abstraite pour implémenter l'interface si vous avez réussi cet exercice félicitations les interfaces sont extrêmement utiles et extrêmement flexibles en c#arp pour faire du code qui est facilement évolutif et maintenable vous avez donc réussi à créer l'interface de contrat pour les opérations et vous l'avez utilisé avec succès pour remplacer l'usage de la classe abstraite par cette interface de contrat donc vous savez comment utiliser les interfaces en séchare si par contre vous n'avez pas réussi je vous invite encore une fois vivement à revoir cette vidéo pour être sûr d'avoir bien bien compris le principe des interfaces en programmation orienté objet et leur usage en c#arpe car c'est un véritable outil de flexibilité qui rendra votre code beaucoup plus évolutif et maintenable il serait vraiment vraiment dommage de s'en priver dans cette vidéo nous allons parler du statique car en effet ces chararp propose un mot clé qui est le mot clé statique vous l'avez peut peut-être déjà vu ce mot clé peut se placer avant une classe avant une méthode mais également avant d'autres choses comme un membre ou une propriété on va faire le tour ensemble en fait on a déjà utilisé ce mot clé auparavant quand on était dans le module link afin de créer des méthodes d'extension on a eu besoin de déclarer notre méthode d'extension comme étant une méthode statique dans une classe statique et la méthode a un formalisme un peu particulier parce qu'on a dû utiliser le motcé vis avant le premier premier paramètrre mais statique va bien au-delà de des simples méthodes d'extension en effet ce mot clé indique une seule chose il n'est pas nécessaire d'avoir une instance d'un objet c'est-à-dire de l'avoir créé avec le motcé New afin d'invoquer la fonction statique ou d'accéder à une information qui est déclarée de façon statique pour que ce soit plus clair je vais vous mettre du code à l'écran voici une déclaration d'une classe statique avec une propriété statique de type int appelé data un membre statique de type String appelé Chan et une méthode statique de type void appelé méthode à chaque fois on a le mot clé statique que ce soit pour la classe pour la propriété pour le membre ou pour la méthode alors de suite je tiens à préciser une chose il n'est pas obligatoire qu'une classe soit marquée comme étant statique pour contenir des éléments statiques par exemple je peux très bien avoir une méthode statique ou une propriété statique statique qui se trouverait dans une classe qui n'est pas elle-même marquée comme statique ça c'est possible avoir du statique dans une classe qui n'est pas statique par contre il n'est pas possible d'avoir des choses qui ne sont pas statiques dans une classe statique par exemple ici je ne pourrais pas avoir public void méthode 2 car je suis dans une classe statique donc on ne peut pas instancier car oui il est impossible de faire un new sur quelque chose qui est déclaré comme statique là par exemple je ne peux pas faire new classe statique on va le voir juste après donc je ne peux pas avoir de méthode de propriété ou de membres d'instance dans une classe déclarée comme étant statique alors ça peut paraître un peu compliqué donc on va creuser encore un peu plus le sujet en fait on utilise le statique depuis le début de ce cours sans que forcément vous vous en rendiez compte par exemple à chaque fois qu'on fait la méthode right line sur la classe console on appelle une méthode statique en effet vous n'avez jamais fait console c est égale à New console c. right line car la classe console est une classe purement statique qui n'expose que des méthodes statiques et oui vous ne vous en étiez pas rendu compte et ben maintenant vous êtes au courant pour invoquer quelque chose qui est statique il est nécessaire et obligatoire d'utiliser le nom du type et non une instance pour invoquer une variable statique encore une fois si je reprends l'exemple de console la classe s'appelle console public statique classe console si la classe console n'était pas une classe statique et que vous auriez créé une variable de type console vous n'auriez pas pu les méthodes statiques sur l'instance que vous aurez créée car en effet statique ne s'applique que sur les éléments du type si je reprends mon exemple précédent avec ma classe statique à gauche j'écris une classe d'instance à droite et une méthode d'instance les trois premières lignes fonctionne j'appelle classe statique donc le type pointchin.data pointméthode et ça fonctionne par contre j'ai une erur de compilation si je veux faire un new class statique et j'ai une heure de compilation si je veux faire un new class statique point accéder à quelque chose admettons que sur la partie gauche je n'ai pas déclaré la classe comme étant statique mais que ces trois éléments sont présents dedans j'aurais pu faire un new class statique donc l'erreur new class statique aurait disparu par contre le new class statique. lui n'aurait pas fonctionné pour accéder à des éléments qui sont statiques il faut bien utiliser le nom du type souvenez-vous comme exemple de console l je vais quand même vous donner quelques conseils d'expérience parce que malheureusement statique est tellement pratique quand on veut aller très vite au but et faire des ch rapidement sans avoir besoin de s'ennuyer qu'on a tendance à y recourir un peu trop rapidement et du code que j'ai pu voir et des expériences malheureuses que j'ai pu rencontré je tiens quand même à vous donner quelques conseils exception fait des méthodes d'extension je recommande d'éviter au maximum le le statique et ce surtout pour les données alors je vais tempérer ce que je vais dire avec une liste à points c'est quelques règles que je m'impose personnellement dans mes développements et pour les développements que je fais pour mes clients et que je vous transmets ici vous pouvez les prendre ou les ignorer c'est c'est à vous de voir mais en tout cas je vous donne quelques conseils autour du statique tout d'abord jamais de membres ou de propriétés statiques qui sont publiques ça peut arriver dans des cas qui sont extrêmement rares mais de façon générale si un membre ou une propriété doit être statique il faut impérativement qu'elle reste privée comme ça vous ne pouvez la modifier que depuis votre classe et c'est généralement un objet qui n'a que d'usage à l'intérieur de votre classe si vous faites quelque chose de statique qui est publique en tant que propriété il y a de très rares cas comme les caches ou les singletons où c'est autorisé mais de façon générale on a aujourd'hui des alternatives à ce genre d'approche c'est pourquoi je trouve que ce n'est plus nécessaire aujourd'hui ensuite on va éviter au maximum les méthodes statiques et attention je précise bien les méthodes statiques et non pas les méthodes d'extension parce que ces méthodes sont non testables par définition on peut pas les substituer et le code qui fait appel aux méthodes statique va forcément être invoqué donc c'est compliqué pour la testabilité bon évidemment ici c'est un cours sur C Charar pas sur les tests j'ai un cours dans mon catalogue sur les tests unitaires et les test d'intégration et les test d'interface graphique et vous verrez que dans ce type de test j'utilise jamais de statique parce que c'est impossible dans un test de remplacer du statique facilement il y a des possibilités mais c'est vraiment capilot tracté on évite donc j'évite au maximum les méthodes qui sont statiques ensuite dans quel cas je vais vraiment avoir besoin du statique c'est typiquement pour les objets de verrou multiread alors ça c'est un sujet un peu avancé mais typiquement c'est quand vous utilisez le mot clé lock c'est ce genre d'objet qu'on va utiliser si vous connaissez si vous ne connaissez pas c'est pas très grave et aussi comme je le disais pour la gestion des caches ou des singletons même si aujourd'hui on peut tempérer cette approche là étant donné qu'on a des alternatives donc en bref j'essaie au maximum dans mon code d'éviter le statique mais encore une fois je me devais de vous le présenter pour que vous puissiez voir à quoi ça ressemble et également que vous puissiez le pratiquer dans la vidéo précédente je vous ai parlé des des interfaces et je vous ai dit que les interfaces étaient là pour déclarer des méthodes ou des propriétés d'instance mais je vous ai aussi dit que depuis carpe 11 il y a eu quelques modifications notamment par rapport au statique c'est le moment d'en parler en fait de base je rappelle la base les interfaces sont là pour déclarer le contrat de ce qui doit être créé sur une instance de telle sorte que quand vous créez une variable d'une classe qui implémente d'une interface elle est substituable par rapport à l'interface qu'elle représente exactement come on a fait dans la vidéo précédente avec l'exercice avec les bonjour on a créé une classe de type bonjour fr es en qui rentrait dans un i bonjour et comme ça en fait on a utilisé le polymorphisme au maximum cependant C chararpe 11 a un peu changé la donne car en effet il nous permet de définir des informations statiques à implémenter que ce soit des membes que ce soit une propriété ou une méthode et vous pouvez également définir directement dans les interfaces des valeurs qui sont statiquement définies comme par exemple une constante ça donne ça vous allez avoir une interface dans lequelle vous allez définir les informations alors cette fois-ci la notation est un petit peu différente car en effet si je mets statique void méthode statique c'est la déclaration d'une méthode statique internol donc les ingénieurs du langage carp devaient faire en sorte qu'on puisse distinguer les méthodes statiques normales des méthodes statiques définis dans les interfaces qui doivent être implémenté d'où l'apparition du motcé abstract après le motcé statique ainsi pour déclarer dans une interface une méthode statique de telle sorte que quand votre classe va implémenter cette interface elle devra forcément implémenter cette méthode statique il faut utiliser statique abstracte et après vous décllarz votre méthode comme vous l'auriez fait dans n'importe quelle interface et on voit également en seconde ligne qu'on peut déclarer une constante directement dans l'interface l'utilité reste à définir parce que forcément pour accéder à cette constante on va être obligé d'utiliser le nom de l'interface mais soit il faut savoir que c'est possible donc quand vous implémentez ce type d'interface vous allez avoir une classe qui implémente le stat St qui implémente donc votre interface et vous allez devoir créer une méthode statique void méthode statique ce qui n'était pas possible av en carp 11 et qui vous permet donc de rajouter également dans vos contrats les méthodes statiques je trouve pas ça très utile à mon niveau parce que de façon générale moi je me sers très rarement des méthodes statiques cependant que vous soyez au courant si les ingénieurs c#arp ont mis ça dans c#arp 11 c'est pour une bonne raison c'est pour la possibilité de définir au niveau des interfaces et donc au niveau de type abstrait notamment les opérateurs sur les éléments je vais pas plus loin dans le détail dans cette vidéo parce qu' encore une fois c'est un cours ici d'introduction et j'ai parlé de cette nouveauté sur ma chaîne YouTube dans une vidéo dédiée où est-ce que justement je rentre dans le détail et je montre pourquoi ça a été implémenté en c#arp 11 alors attention petite subtilité une classe statique ne peut pas implémenter d'interface quand bien même l'interface qu'on veut implémenter définit des méthodes statiques en bref pour implémenter une interface il est nécessaire que votre classe soit une classe d'instance c'est obligatoire si vous essayez de faire une classe statique qui implémente une interface peu importe l'interface vous allez avoir une erreur de compilation qui vous dit que une classe statique ne peut pas implémenter d'interface donc on est obligé de créer une classe et donc c'est ici qu'on retombe sur le cas où on a quelque chose de statique dans une classe normale vous êtes obligé d'avoir une classe qui soit instantiable donc qui n'est pas statique pour implémenter une interface petit subtilité on pourrait s'y perdre effectivement du fait que dans l'interface on a du statique donc ça fait quand même des notions assez importantes et peut-être nombreuse et c'est pour ça que je ne vais pas vous laisser partir sans avoir fait un exercice dans cet exercice nous allons améliorer encore une fois le comportement de notre calculatrice en sauvegardant toutes les opérations qui auront été effectuées alors attention il y a une spécificité on ne va pas pour ça modifier le code de la classe calculatrice parce qu'on est effit ce serait assez simple dans la calculatrice d'avoir une liste d'opérations et de permettre d'exécuter une opération ce qui veut dire que au lieu d'avoir opération dans le constructeur de la calculatrice on aurait la méthode exécutée qui prendrait en paramètre l'opération exécuté et qui par la même occasion la stockerait pour avoir un historique et qui par la même occasion la stockerait pour mentenir un historique ce serait sans aucun doute une bonne implémentation qui permettrait d'ailleurs à notre notre calculatrice de faire encore plus de choses mais ici vu qu'on est dans une vidéo autour du statique on va créer une classe statique pour y stocker toutes les opérations qui sont effectuées donc notre classe statique que moi je vais appeler personnellement historique contiendra la liste de toutes les opérations effectuées et on va donc devoir modifier le code du fichier programme.cs pour boucler afin de réaliser des opération dans la boucle on instantiera systématiquement une nouvelle calculatrice pour exécuter les opérations correspondant à la boucle afin de sortir de la boucle personnellement je choisirai que quand la personne saisit la lettre Q pour l'opérateur c'est qu'il veut quitter ce sera mon signal pour quitter et donc une fois que on aura terminé le flux d'opération il suffira d'afficher toutes celles qui ont été réalisées en bonus si vous souhaitez encore un petit peu améliorer la façon dont vous allez traiter l'affichage des opérations n'hésitez pas à faire l'override d'une méthode par particulière la méthode tout string qui est définie de base dans la classe Object donc duquel donc classe de laquelle tous les éléments en cécharpe Hite afin d'avoir un affichage sympathique comme par exemple si je devais redéfinir la méthode to string de l'addition j'aimerais bien afficher 10 + 5 est é= à 15 il faudra donc bien faire en sorte que les opérations qui soient sauvegardées puissent s'afficher comme ceci afin qu'à la fin de notre programme on affiche toutes les opérations qui ont été réalisées ici on va donc faire l'usage d'une classe statique mais soyez quand même vigilant on le fait dans un but pédagogique et un défin d'exercice ce n'est pas forcément la meilleure approche pour réaliser ce qu'il y a dans le cadre de cet exercice c'est juste que je vais vous faire pratiquer le statique de façon générale j'ai plutôt tendance personnellement à l'éviter donc soyez quand même vigilant mais je vous laisse faire l'exercice revenir en arrière si nécessaire et moi je vous retrouve dans quelques secondes pour qu'on corrige ensemble cet exercice je suis donc ici sur Visual Studio code et j'ai fait un petit peu de code en avance de phase du tournage de se corriger pour gagner du temps c'est très simple j'ai tout simplement créé une boucle infinie autour de la gestion de la saisie des nombres et du calcul donc en fait qui englobe tout le code qu'on a fait jusqu'à présent avec le résultat de votre opération est égale et ainsi de suite la seule chose que j'ai fait c'est que j'ai rajouté dans le message appuyé sur Q pour quitter au niveau de la saisie de l'opérateur et si l'opérateur est égal à la lettre Q dans ce ce cas-là je fais un break en fait c'est une instruction qui va simplement me dire que j'arrête le déroulé de ma boucle donc je vais sortir et aller ici à la prochaine instruction là il n'y en a pas donc ça va simplement arrêter le programme pour l'instant le but de cet exercice était d'hystoriser toutes les opérations qui ont été réalisées pour se faire on va passer par une classe statique alors comme je l'ai dit juste avant dans le slide ce n'est pas forcément la meilleure approche mais c'est celle qui va nous permettre de pratiquer le statique et de voir comment cela se comporte on va donc créer ici au niveau de notre projet une nouvelle classe qu'on va appeler historique je le mets à la racine au même niveau que la calculatrice car pour moi cette classe n'a pas sa place dans le dossier d'opération dans le sens où ce n'est pas une opération supplémentaire elle va juste nous permettre de travailler avec la calculatrice cette classe historique va être un petit peu particulière parce qu'on ne va pas vouloir l'instancier mais on va vouloir l'exploiter depuis différents endroits sans avoir d'instance c'est-à-dire sans avoir besoin de faire de New cela crée malgré tout ce qu'on appelle une dépendance implicite à une classe qui est en quelque sorte masquée ce qui veut dire qu'en fait de façon sous-jacente quand quelqu'un utilise votre calculatrice pour exécuter des opérations il ne le sait pas forcément mais la classe historique est utilisée de façon sous-jacente sans que cela soit explicite c'est bien pour ça qu'à titre personnel je tends à ne pas favoriser le statique je préfère que mes dépendances soient explicites un petit peu comme ici dans une calculatrice on sait que pour créer une instance de cette calculatrice simplifi il est nécessaire de fournir l'opération donc ici je serais tenté de mettre qu'il est nécessaire de fournir également l'historique à alimenter mais vu qu'on pratique le statique on va passer cette classe historique en statique c'est extrêmement simple à faire il suffit de rajouter le mot-clé statique comme ceci à partir de là il devient donc impossible d'instancier cette classe car une classe statique n'existe que de façon unitaire pour toute votre application de façon simplifiée si ici je vais dans mon programme que je me mets tout au début et que je fais historique h est égal à New historic vous voyez que j'ai une erreur ici il est impible d'avoir une variable de type statique historique et donc le New ne marche pas non plus vu que ma classe est déclarée comme étant statique cela est donc impossible je vais donc dans cette classe historique créer une liste de opération qui sont les opérations comme ceci et je vais donc la rendre en lecture seule afin de pouvoir uniquement accéder à la liste des opérations quand bien même la liste expose des méthodes permettant de gérer le contenu cela m'évite que quelqu'un puisse redéfinir directement l'instance de ma liste on voit qu'on a une erreur ici historique ne peut pas avoir des éléments d'instance pourquoi et bien tout simplement parce que la classe historique est elleemême déclarée comme statique et vu que une classe est statique elle ne peut pas être instanciée donc tout ce qui est défini dessus doit forcément à son tour être statique je suis donc obligé de rajouter ici le mot clé statique on remarquera également un autre warning qui me dit que l'opération n'est pas affectée en bref c'est ce que veut dire ce message on viendra sur la notion de nulabilité dans le prochain module ici il va donc falloir donner une valeur par défaut à cette liste je vais donc l'instancier comme ceci à la construction de la classe statique oh oh une minute j'ai dit juste avant qu'on pouvait pas construire de classe statique alors pourquoi je viens de dire maintenant que je vais instancer cette liste à la construction de la classe statique et bien tout simplement parce que statique veut dire que votre classe est accessible de partout mais à un moment ou un autre la seule instance qui va exister doit bien être construite il y aura donc ce qu'on appelle un constructeur statique je nen ai pas parlé dans les slides en fait ce constructeur statique est un petit peu particulier il faudra reprendre statique avec le nom de la classe comme ceci afin de faire ce qu'on appelle un constructeur statique on conviendra qu'il est beaucoup plus simple d'affecter la propriété avec égal new comme ceci pour avoir une nouvelle instance de la liste d'ailleurs on peut aussi le faire comme ceci depuis carpe 12 en disant que c'est une collection vide pour éviter d'appeler le New qui pourrait parfois être un peu plus performant avec cette syntaxe qu'avec l'utilisation du constructeur mais en bref la seule chose que j'ai envie c'est que quand ma classe historique sera utilisée la liste des opérations soit à minima créé pour que je puisse ajouter des éléments dedans petite subtilité il est totalement impossible d'ajouter des membres concrets des membres d'instan dans une classe statique pour autant il n'est pas impossible dans une classe qui n'est pas statique d'ajouter quelque chose de statique ici je pourrais très bien stocker les opérations directement au niveau de la classe comme ceci de tel sorte que calculatrice non pas l'instance mais la classe Point opération contienne toutes les opérations le le fait de passer par une classe historique me fait pratiquer à la fois le statique au niveau de la classe et à la fois au niveau de la propriété mais vous remarquez ici que je n'ai pas d'air de compilation car il est tout à fait possible d'avoir quelque chose défini statiquement dans une classe d'instance comme une méthode ou une propriété bref je vais donc revenir ici en arrière et ce qu'on va faire c'est que quand on appelle la méthode exécuté ou quand on créer une nouvelle instance de la calculatrice au choix je vais alimenter l'historique pour ça je dois reprendre le nom de la classe et si je fais un point on remarquera que j'ai accès à Opération la propriété et oui ici je n'ai pas besoin d'avoir d'instance donc je n'ai pas besoin d'avoir une variable qui contient le type historique je vais directement utiliser le type en tant que tel qui est statique et qui m'expose des éléments qui ne nécessitent pas d'instance et donc ici je vais pouvoir faire add de l'opération dans la liste définie statiquement sur ma classe historique ellemême statique à partir de là dans mon programme ici je vais pouvoir boucler à la fin avec la boucle for each par exemple pour toutes les opérations dans historique.opération je vais les afficher sur la console op.t string car oui je vais vous montrer comment on peut faire l'overde de la méthode to string pour avoir des éléments qui sont plus agréables visuellement donc au final vous voyez qu'en fait j'utilise la classe historique statique avec sa propriété opération statique et ce sans instance à deux endroits différents dans le programme.cs et dans la calculatrice l'avantage si je puis dire c'est que vu que je n'ai qu'une seule instance elle est partagée entre tous les éléments de mon code et de mon application et donc je n'ai pas besoin de me trimballer une instance à droite et à gauche cependant je le répète très grand point de vigilance pour plusieurs raisons tout d'abord ici c'est exactement ce que je disais juste avant on n pas depuis l'extérieur ici depuis mon programme je n'ai pas d'information quand j'exécute ce code-là ligne 51 et 52 que la calculatrice de façon sous-jacente alimente l'historique ce n'est pas du tout explicite en l'occurrence c'est ce qu'on appelle une dépendance implicite vers quelque chose de statique donc une dépendance forte de surcroix d'ailleurs si vous êtes intéressé par les tests automatisés j'ai également un cours à ce sujet dans mon catalogue que je vous inviterai à acquérir et à visionner quand vous aurez acquis assez de compéten en ccharp si cela vous intéresse ce type de code est très très peu testable et très difficilement testable donc il est recommandé d'éviter le statique au maximum pour terminer une des raisons principales pour lequel je l'évite c'est que l'instance et les éléments statiques sont partagés à un niveau unique en mémoire et typiquement quand on fait des application multi-utilisateur comme une application web par exemple ça voudrait dire également que tous les utilisateurs utilisent la même instance ce qui peut des fois être intéressant mais dans ce cas-là on va plutôt privilégier quelque chose d'instance une classe d'instance avec la durée de vie singleton le design pattern Singleton j'ai une série sur YouTube sur le design pattern et si vous souhaitez en savoir plus sur comment utiliser des singletons en web je vous renvoie vers mes formations blazor et spnet où est-ce que je vous montre ce genre de fonctionnement je ferme la parenthèse maintenant que nous avons alimenté nos opérations avec la calculatrice et qu'on les lit ici la seule chose à faire va être de les afficher de façon cohérente parce que oui appeler la méthode to string sur une opération fait que elle risque d'être mal représentée donc chaque opération dans la liste ici doit avoir sa représentation textuelle par exemple si je prends la classe addition je vais faire l'override de la méthode to string donc comme vous le voyez quand je tape le mot-clé override et que je fais un espace Visual Studio code me montre toutes les méthodes que je peux substituer on en trouve trois les trois méthodes définies dans la classe Object et on y reviendra plus tard donc ici je vais faire l'override de la méthode to string comme ceci et à partir de là on on peut voir d'ailleurs que Visual Studio code me génère automatiquement la valeur de retour comme étant base donc la méthode de base point to string la méthode de base définie dans la classe Object vu que notre classe opération ne la redéfinit pas va simplement afficher le nom du type avec son espace de nom donc si je le laisse en tant que tel j'auraai TP calculatrice.opération.addition je pense que vous en conviendrez assez facilement pour l'utilisateur de notre calculatrice cela n'apporte absolument aucune information pertinente au lieu de ça on va simplement retourner une chaî de caractère parce qu'on va avoir ici l'opérant gauche plus l'opérant droite est égal au résultat et je peux faire tout cela car tout ça est stocké dans mon instance d'opération qui va être créée à chaque fois et ajouté par la calculatrice dans l'historique je vais donc aller copier cette représentation textuelle et la mettre dans chacune des opérations une fois ceci fait toutes mes opérations ont donc une une représentation textuelle ce qui veut dire que d'après la logique dans le programme. CS je devrais pouvoir saisir plusieurs opérations et quand j'appuie sur Q retrouver l'historique des opérations je vais d'ailleurs rajouter ici une ligne comme ceci avec des barres pour bien spécifier une séparation et mettre après historique de point essayons notre implémentation commençons par une addition donc je mets d'abord l'opérateur plus ensuite je mets 10 et 10 le résultat est 20 très bien faisons ensuite une soustraction 85 - 42 le résultat est 43 faisons après une multiplication de 12 par 88 le résultat est 1056 donc nous avons fait trois opérations si j'appuie sur Q je quitte la boucle et je retrouve donc ici l'historique des opérations que j'ai faites 10 + 10 85 - 42 et 12 x 88 après bien entendu vu que tout ça a été redéfini dans la division le moduo et ainsi de suite si j'avais fait plus plus d'opérations l'historique aurait été récupéré aussi en bref vous avez vu comment vous pouvez utiliser une classe statique pour partager des informations entre différents types sans utiliser d'instance je rappelle encore les dangers du statique avec les dépendance implicite et le fait qu'elle soit partagée par tout le monde mais dans le cas présent cela nous a permis d'atteindre notre objectif et donc de réussir ce TP d'ailleurs si vous avez réussi cet exercice félicitations vous savez maintenant comment utiliser les types statiques afin de rajouter des comportements particuliers dans vos classes avec parsimonie bien entendu si vous n'avez pas réussi j'ai envie de dire presque ce n'est pas très grave je vous invite quand même à revoir la vidéo cela pourrait s'avérer utile dans certaines situations précises mais de façon générale vu qu'il est plutôt préférable de l'éviter ce n'est pas très grave si cet exercice n'a pas été réussi et si dans votre tête c'est mieux de faire le stockage dans la calculatrice et donc de l'extraire de la boucle pour récupérer l'historique de la calculatrice avec un élément d'instance c'est encore mieux on verra plus tard dans ce cours un usage du mot-cé statique qui permet de faire ce qu'on appelle des méthodes d'extension extrêmement utiles dans le développement cécharpe c'est pourquoi le moclé statique n'est pas simplement à bannir il doit juste être utilisé dans des cas bien précis