Cours de C# pour l'ESSI - Cours 02 : Initiation

RACINE

Voir dans une fenêtre à part Cliquez ici pour voir la page dans un explorateur séparé.

Index Rapide


Partie 1 : Introduction

Ce premier TP a pour but de familiariser un(e) utilisateur(trice) de Java à la programmation en C#. Ce dernier ne sera pas "difficile" pour quelqu'un habitué à Java. Le but est ici ouvertement de se "faire la main" avec un petit exemple en C#. Si vous recherchez un TP évolué ou traitant d'un sujet précis, je vous suggère de vous référer à l'index des cours/TP.

Ce TP sera peu "encadré" car vraiment peu difficile. Le but est de donner du matériel pour découvrir par vous même ce qu'est le C#. Ainsi, c'est ici votre curiosité et votre esprit d'initiative qui sont sollicité !

Il est plus que conseillé de se référer à la présentation C# vs. Java en cas de difficultés.
Si vous constatez des erreurs, des imprécisions ou que vous avez des problèmes avec ce TP, adressez vous à l'auteur .

Tout le matériel qui est présenté n'est nullement un cours officiel de l'ESSI ou de Microsoft. Il a été produit par l'auteur et en est l'exclusive propriété.
Toutes remarques pouvant aider à l'améliorer ou à corriger les diverses erreurs pouvant subsister sont les bienvenues. (email auteur )

retour à l'index

Le sujet

Nous allons gérer un agenda hospitalier. On pourra prendre des rendez-vous, les annuler ...
Le but est de prendre un exemple simple et didactique. De plus, les ESSIens de première année ont réalisé ce projet cette année en Java.
Vous trouverez la version originale Java du sujet ici :
Quant à la version C#, c'est .

retour à l'index

Une solution

ATTENTION : je tiens à signaler que ceci est bien évidemment UNE solution et non pas LA solution ultime. Certains choix sont discutables (heureusement) et n'engagent que moi. Si vous avez un problème ou une question à propos de cette solution, contactez moi. De même si vous estimez avoir une solution plus intéressante où plus claire sur certains points, je serais ravi de faire figurer votre nom au panthéon de cette page. :)

Vous êtes sûr que vous voulez télécharger une solution ? Si oui,

retour à l'index

Partie 2 : Un peu de cours

Java vs. C# (encore !)

Commençons par un petit tableau complétant celui se trouvant dans le cours #1. Ce dernier compare certains mots réservés des deux langages. Ici, pas de mots réservés mais plutôt des structures...

Vous faisiez ça en Java ... ... et c'est comme ça en C# Pour faire ça ...
java.util.VectorSystem.Collections.ArrayListDes tables non ordonnées avec accès indexés, à taille variable.
java.util.TreeSet, java.util.SortedSetSystem.Collections.SortedListUn ensemble ordonné, basé sur des doublets clé-valeur, sans doublons. Accès en log2n.
implements Serializable (interface)[Serializable] (attribut de classe)Permettre aux objets de votre application d'être sérialisés (passés dans un flux après formatage). Le flux pouvant être un fichier, un socket, ...
SortedSet.isEmpty()SortedList.Count == 0Savoir si un ensemble est vide ou non. En C#, le compte est un "attribut" (en fait, un Get/Set caché !!)
UneClasse m = (UneClasse)unSortedList.get(uneCle)UneClasse m = (UneClasse)unSortedList[uneCle]Récupérer l'élément de clé uneCle dans l'ensemble.
GregorianCalendarDateTime, GregorianCalendarAttention : DateTime est une structure. Section dédiée.

retour à l'index

Entrées-Sorties

La sortie


En C# comme en Java, on passe par un filtre/formateur avant d'accéder directement au flux. Nous n'allons nous intéresser ici qu'au filtre binaire (correspondant au filtre ObjectOutputStream de Java). Voici un petit exemple :
try{
    BinaryFormatter ser = new BinaryFormatter();
  
    FileStream fout = new FileStream(nomFichier, FileMode.Create);

    ser.Serialize(fout, set);
  
    fout.Close();
}
catch (Exception) { /* gestion d'erreur*/ }
csharpindex.com/colorCode
Deux objets sont utilisés ici :
  • BinaryFormatter : le filtre binaire. La sérialisation "standard" (par rapport à la sérialisation XML)
  • FileStream : le flux fichier (correspondant au FileOutputStream Java)
Il suffit d'appeler la méthode Serialize qui prend un Objet et le sérialise dans le flux en paramètre. Attention, il faut que tout ce que vous sérialisiez soit Serializable. Cela se fait au moyen de l'attribut de classe [Serializable].
[Serializable]
public class UneClasse { /* --du code-- */ }
Pour en savoir plus sur la sérialisation, allez voir la doc .NET Framework section :

Les entrées


On prends les mêmes et on recommence ! Seule différence, l'exemple ci-dessus sérialise n'importe quoi du moment que c'est Serializable. Par contre, à la déserialisation on DOIT connaître le type de ce que l'on désérialise si on veut le down-caster ... Normal quoi !
UneClasse unObjet;

BinaryFormatter ser = new BinaryFormatter();
	    
FileStream fout = new FileStream(nomFichier, FileMode.Open);
	    
unObjet = (UneClasse)ser.Deserialize(fout);

fout.Close();

retour à l'index

Dates et heures

La gestion des dates et heures en C# est nettement simplifiée par rapport à Java !! Plus besoin d'utiliser la classe GregorianCalendar (présente à la quasi-identique en C#). La structure DateTime suffit TRÈS largement !
Succincte mais avec tout ce qu'il faut dedans ! Ainsi la gestion d'ajout d'heures, minutes, ... est intégrée. Ajouter une demi-heure à un DateTime ?
DateTime d = new DateTime (DateTime.Now);

d.AddMinutes (30);
//le décalage d'heure, jour, mois, ... est AUTOMATIQUEMENT géré

TimeSpan interval = (d - DateTime.Now).Duration();
//on crée un TimeSpan dont la durée représente la différence absolue (à cause du Duration()) entre d et Now
La structure TimeSpan sert à représenter des intervalles de temps.
Le formatage est bien entendu présent au moyen de .. ToString ! Un simple appel à unDateTime.ToString("f") retourne :
tertredi 34 fevrimai 2143 34:62.

Bien évidemment, tout ce que vous aurez toujours voulu savoir sans même le savoir dans l'aide .NET Framework !

retour à l'index

Partie 3 : Réalisation

Sujet version C#

Vous trouverez la version C# du sujet. Vous pouvez suivre les étapes, n'en faire qu'à votre tête, ou commencer par la fin ! Mais pensez à vous aider des différents cours présentés ici, et notamment des différents points traités ci-dessus.

retour à l'index

L'analyse UML

Pas de projet plus compliqué qu'un "hello world" sans un brin d'analyse (même sommaire). Ici, je présenterai simplement le diagramme de classe statique. Je ne présenterai pas les diagrammes d'interactions ni les diagrammes d'états.

Ceci est UNE implémentation, et ne reflètera peut-être pas la façon dont vous aurez traité le problème. Mais tant que tout vos choix sont justifiables, aucun n'est mauvais.
Pensez bien à vous reporter aux spécifications du sujet en ce qui concerne les fonctionnalités que l'on doit retrouver.

retour à l'index

IHM

Quelques conseils

L'IHM (Interface Homme Machine) est la clé des programmes d'aujourd'hui. En effet, si les utilisateurs sont perdus devant votre soft, c'est alors un mauvais soft et même si au niveau de sa réalisation il a 10 ans d'avance.
Une des choses les plus importantes à faire est de se mettre à la place de l'utilisateur final : Que veut-il faire ? Comment ? Qu'est qu'il va faire souvent, et pas souvent ? Qu'est ce qui est crucial ?
Autre chose très importante : faites comme si l'utilisateur était un néophyte total en informatique. Automatisez ce qu'il n'a pas besoin de savoir faire. Trop de choix sont souvent les ennemis d'un programme clair.
Dernière chose : pensez à tout ce qu'il peut faire ! Même des choses bizarres, incohérentes. cliquer dans n'importe quel ordre, taper des lettres là où on attend des chiffres, ... Ce n'est pas à lui de gérer cela ! C'est à l'interface graphique de faire tampon avec le Noyau Non Interactif (NNI) de l'application qui lui ne vérifie pas ce genre de choses.
Idée : passez votre programme à un(e) copain(ine) qui adore cliquer et trouver des bugs. Ca l'occupera, et comme lui n'a pas d'à priori sur votre logiciel, il trouvera des bugs que vous n'avez pas vu et que vous n'auriez jamais vu.

Comment faire une IHM en Visual C# avec Visual Studio .NET ?

Bien entendu vous pouvez faire une IHM "from scratch" avec votre éditeur texte, mais toute personne l'ayant fait sera ravi de savoir que Microsoft Visual Studio .NET (abrégé VS .NET) gère les interfaces graphiques en C# à merveille !
C'est avec cet outil que nous allons faire notre IHM. Bien entendu, pas question de vous mâcher le travail : nous allons ici voir comment faire un petit programme en C# avec une mini interface graphique, pour apprendre à utiliser VS .NET.


Tout d'abord, créons un projet !
Nous voulons un programme graphique Win32.
Il s'appellera TestIHM et nous allons le placer dans le répertoire D:\C#Work\mini-ihm\.
cliquez pour voir en agrandi ...
Voici à quoi ressemble l'environnement VS.NET.
Vous avez :
  • sur la gauche les outils (pour créer des contrôles types bouton, label, ...)
  • au centre la frame que vous êtes en train de créer (vierge pour l'instant)
  • sur la droite les propriétés de ce que vous manipulez
Si vous passez avec votre souris à gauche, sur les outils, vous verrez apparaître cette liste. elle vous permet de choisir quel contrôle vous voulez ajouter sur la frame.
Nous allons dessiner un bouton pour commencer. Il suffit donc de cliquer sur l'élément Button.
cliquez pour voir en agrandi ... Il suffit ensuite de dessiner le contrôle sur la frame comme on souhaiterait le voir apparaître.
Voilà le composant créé ! Il a la position, taille et texte qu'il aura à l'exécution.

En effet, VS.NET est un environnement WYSIWYG (What You See Is What You Get, vous voyez le résultat).
Modifions ensuite notre bouton. Faisons lui afficher le texte "Cliquez ici !". Pour cela, direction les propriétés et le champ Text.
NB : le & avant le "C" de "Cliquez" signifie que la combinaison "Alt-C" sera un accélérateur de ce bouton.
De plus le nom par défaut Button1 n'étant pas très parlant, appelons notre bouton btnCliquezIci.
C'est alors le champ (Name) qu'il faut modifier. Ce sera le nom de ce composant, et il pourra être référencé plus tard au moyen de celui ci.
En effet, ce n'est rien d'autre qu'un instance de la classe Button...
Ajoutons un Label (un texte) et un DateTimePicker (un calendrier joli).
Mettons en forme ... et voilà !
Qu'a fait VS.NET dans votre dos ? Eh bien toute la glue programmatoire !
Il a réunis dans une méthode toutes les instructions nécessaires pour générer votre interface.
Voici ce à quoi cela ressemble dans notre cas ...
cliquez pour voir en agrandi ...
Mais bon, comme on utilise VS.NET pour NE PAS taper tout le code de l'IHM, autant ne pas développer cette partie du code ...
Un peu d'action ! Comment brancher un callback ? Faciiiiiile !
Pour les "courants" (clic pour les boutons, Load pour les frames,...) le double-clic sur le composant suffit : VS.NET génère le code pour vous.
Sinon, un petit tour parmi les évènements du contrôle s'impose...
cliquez pour voir en agrandi ...
Autre grand avantage de VS.NET : le code-audit.
Besoin d'un nom de méthode, d'attribut ? Tapez le nom de l'instance puis "." et attendez une seconde : la liste des membres correspondant au contexte apparaît.

Et si vous êtes un peu flemmard (et/ou malin) tapez les premières lettres du nom d'un objet, puis "Alt-droite" et VS.NET complètera le nom.
Et ce n'est pas tout : pour chaque méthode ou attribut, un petit tooltip explicatif.
Pareil pour les paramètres d'une méthode ...
cliquez pour voir en agrandi ...
Et voilà notre "application" en train de tourner. Regardez aussi le joli composant DateTimePicker. Difficile de faire plus convivial et plus simplement !!

Quelques (petits) conseils avec Visual Studio .NET

Quand vous tapez le code dans une frame, pensez que cette dernière est un objet ! Ainsi, la frame sera référencée par this, et notre bouton par this.btnCliquezIci.

Pareillement, si vous instanciez cette frame "à la main" où à partir d'une autre, vous accéderez à ses composants par le-nom-de-la-frame.le-nom-du-contrôle ...

Pensez aussi que tout les contrôles ne sont rien d'autres que des attributs d'instance de votre frame. Ils ont donc une visibilité ! Ainsi, si vous développez une frame "spéciale mot de passe", fournissez une méthode pour recevoir un mot de passe et masquez les contrôles.

Bidouillez ! Essayez, cherchez ! Rien de tel pour apprendre. Testez les différentes propriétés des différents contrôles. Et pensez à l'aide.

Visual Studio .NET n'est pas un simple IDE (Integrated Developpement Environment) mais il a une réelle intégration avec votre système. Toutes les aides de développement sont regroupées dans son système de recherche. Ainsi, les aides Win32, MMSystem, DX, .NET Framework sont accessibles comme si elles n'étaient qu'unes.

VS.NET est un outil qui mérite d'être découvert et utilisé. Pensez toutefois à garder un oeil sur ce qu'il fait, pour ne pas être perdu si un jour vous devez développer sans IDE ;)

retour à l'index

Partie 4 : Le mot de la fin

Conclusion

J'espère que ce petit projet de génie logiciel aura su vous permettre de vous dégourdir les doigts en C#.
Il a été volontairement peu encadré pour permettre aux curieux d'apprendre (non pas de se planter !!).
Je pense qu'il a été utile car il a permit de découvrir C#, ainsi que l'outil quasi-indispensable qu'est Visual Studio .NET.

Comme toujours, pour contacter l'auteur : le mail !

retour à l'index

Remerciements

Merci d'abord à Laurent ELLERBACH de Microsoft France pour m'avoir fourni cette opportunité et pour son aide.
Merci aussi aux professeurs de l'ESSI : M. Michel RIVEILL qui m'a conseillé et suivit, ainsi que Mme. Anne-Marie PINNA-DERRY et Mme. Mireille BLAY-FORNARINO pour leur aide très précieuse et leurs gentilles relectureS.
Merci à M. Michel Thomas pour ses remarques bienvenues.
Merci aussi à Céline pour sa relecture malgré sa non compréhension de ce dont je parle :)
Enfin, merci à Stef et Tophe d'avoir relut ma prose et pour leur feedback.

retour à l'index





par Alain Vizzini (vizzini@essi.fr )
pour l'ESSI & Microsoft, création 06-03-2002, dernière màj 15-09-2002


pages vues depuis le 14 oct. 2002