Académique Documents
Professionnel Documents
Culture Documents
C# Chapitre 7 - L'Evenementiel
C# Chapitre 7 - L'Evenementiel
C# Chapitre 7 - L'Evenementiel
L’événementiel
- Cours de découverte du C#-
Plan
Les Délégués
Les Evénements
Les Exceptions
+
Délégués
Rappels et définition
Le délégué permet de définir une signature de méthode et avec lui, il est possible
de pointer vers n’importe quelle méthode qui respecte cette signature.
● Le délégué est alors utilisé comme un nouveau type.
Deux méthodes :
● void AfficherConsole(string message) { ... }
● void AfficherFenetre(string message) { ... }
Le délégué :
● delegate void AfficherDelegate(string message);
Exemple - utilisation
Affectation
● affichage = AfficherConsole;
● affichage += AfficherFenetre; //On dit que le délégué peut être multicast
Utilisation
● affichage("Message affiché de deux manières différentes en un seul appel");
● affichage -= AfficherFenetre; // Ne plus afficher par fenêtre
● affichage("Un message sans fenêtre");
● affichage = AfficherFenetre; // Fenêtre seulement (affectation par =)
● affichage("Un message dans une fenêtre");
Exemple d’utilisation d’un delegate
Délégué anonyme : au lieu d’utiliser une variable de type delegate qui pointe
vers une méthode, c’est comme si on écrivait directement la méthode.
● Évidemment, celle-ci doit respecter la signature du délégué
● Création dynamique de la fonction associée
o delegate( arguments ) {code }
Délégué qui permet de pointer vers une méthode qui ne renvoie rien
et qui peut accepter jusqu’à 16 types différents.
/////////////////
RunTheMethod(Method1, "Arcreane", 3); //test vaudra r
RunTheMethod(Method2, "Arcreane", 3); //test vaudra e
Le délégué générique Func<T>
//Méthodes très simples qui ont toutes un type de retour et des paramètres identiques.
private static int Add(int i, int j) { return i + j; }
private static int Sub(int i, int j) { return i - j; }
Exemple avec la méthode Find des tableaux
L’héritage est la réponse spontanée aux questions d’architecture logicielle car il facilite
grandement la structuration des objets
Lorsqu’une subclass n’utilise qu’une petite partie de la classe parente ou que l’héritage
n’est qu’une réutilisation de code commun et pas parce que la subclasse étend la classe
mère il vaut mieux passer par un délégué
● En refactorisant le code on remplace l’héritage par une composition
● La subclass va présenter un délégué auquel pourront s’attacher les classes à même de répondre au
besoin
Exercice - delegates
Ajouter une classe CommunicatingClass dont hériterons toutes les classes devant
interagir avec le joueur.
● Faire hériter les classes
Ajouter 2 delegates :
● Un pour récupérer les actions du joueur (GetPlayerAction)
● L’autre pour lui faire parvenir des informations (InformPlayer)
L'utilisation des opérateurs += et -= est réalisée par des appels aux accesseurs
add et remove de l'event.
Il est possible de remplacer les accesseurs par défaut créés par le compilateur.
Pour l'exemple précédent, les accesseurs par défaut sont définis ainsi :
public delegate void PageRecueDelegate(string url, string contenu);
public class ConnectionHttp {
private PageRecueDelegate _pageRecue;
public event PageRecueDelegate PageRecue {
[MethodImpl(MethodImplOptions.Synchronized)]
add // paramètre value : fonction à ajouter { _pageRecue += value; }
[MethodImpl(MethodImplOptions.Synchronized)]
remove // paramètre value : fonction à retirer { _pageRecue -= value; }
}
}
EventHandler
Propriétés principales
● Interval : entier représentant la durée (en millisecondes) entre deux tics. Par défaut cette
durée vaut 100ms.
● Start : méthode qui démarre le Timer.
● Stop : méthode qui arrête le Timer.
● Tick : gestionnaire d'évènements qui lance un évènement à chaque tic.
Event
● Elapsed : événement envoyé à chaque fois que l’intervalle de temps est écoulé
Exercice – Events
Erreurs du compilateur
● Associées à un numéro
● Permet de googliser l’erreur pour la comprendre
Erreurs en runtime
● Remonter des infos claires pour effectuer les correctifs rapidement
● Éviter que l’utilisateur reçoive un message d’erreur incompréhensible
Blocs finally
● Pour que du code soit exécuté qu’une exception ou non soit levée (pour de la
libération de ressources par exemple)
● Il ne peut y avoir qu’un seul bloc finally
OnUnhandledException
try
{
// Ouverture de la connexion à la base de données
// Exécution d’une instruction en base de données
//….
}
catch (ExceptionType1 ex) { // Gestion de l’exception spécifique 1}
catch (ExceptionType 2 ex) { // Gestion de l’exception spécifique 2}
catch (Exception ex) { // Gestion de l’exception générique}
Finally
{
// Fermeture de la base de données
// Nettoyage propre des ressources
//…
}
Lancer et intercepter des exceptions
Une exception est comme une alerte, le but est d'éviter une mauvaise opération
L'intérêt de lancer une exception est que du code ait été prévu pour la gérer,
sinon le programme s'arrête brutalement
Il est possible de lancer des exceptions, lorsqu’il est jugé nécessaire de le faire.
● throw new nomDeLexception();
Une exception est levée à partir d'une partie du code où un problème s'est
produit.
● L'exception remonte la pile jusqu'à sa prise en charge par l'application ou l'arrêt du
programme.
Créer ses propres exceptions
N’interceptez pas d’exception si vous ne pouvez pas la gérer tout en laissant l’application dans
un état connu
La gestion et la levée des exceptions fonctionnent de la même façon pour tous les langages de
programmation .NET.
Les exceptions offrent des avantages par rapport à d’autres méthodes de notification des
erreurs, comme les codes de retour.
● Les erreurs ne passent pas inaperçues, car si une exception est levée et qu’elle n’est pas gérée, le runtime
arrête l’application.
● Les valeurs non valides ne continuent pas à se propager dans le système parce que du code n’a pas pu
vérifier un code de retour d’échec
Exceptions courantes
Levée par les méthodes en cas d’état non valide. Appel de Enumerator.MoveNext() après la suppression
d’un élément de la collection sous-jacente.
InvalidOperationException
Classe de base pour toutes les exceptions d’argument. Aucun (utilisez une classe dérivée de cette exception).
ArgumentException
Levée par les méthodes qui n’acceptent pas la valeur Null String s = null;
ArgumentNullException pour un argument. "Calculate".IndexOf(s);
Levée par les méthodes qui vérifient que les arguments String s = "string";
ArgumentOutOfRangeException sont inclus dans une plage donnée. s.Substring(s.Length+1);
Exercice - Exception