none
Message sur PropertyChanged

    Question

  • Bonjour a tous,

    Une petite question a titre d'info, dans mon code je reçois un message dans la fenêtre des erreurs (0 erreurs, 0 avertissement, 1 message)

    Le message : "L'appel de délégué peut être simplifié."

    le message pointe sur PropertyChanged de la procédure suivante :

    		private void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
    		{
    			if (PropertyChanged != null)
    			{
    				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    			}
    		}

    Donc je voudrais savoir, svp, ce que ce message veux dire. Transfomation de l'appel en expréssion Lambda ? (je débute donc les Lambda je suis loin de maitrisé)

    (Je suis sous VS2017)

    Merci d'avance.


    Laurent


    lundi 20 mars 2017 15:17

Réponses

  • Bonjour,

    Depuis C# 6.0 on peut simplifier les appels de délégué tel que dans votre cas. VS2015 et+ vous indique que c'est le cas.

    Quand vous vous positionnez sur ce votre code une ampoule apparaît à gauche de la ligne et en cliquant dessus un assistant vous permet de simplifier votre code (vous pouvez également utiliser la combinaison de touche "Ctrl + .").

    Normalement votre code devrait devenir quelque chose comme:

    		private void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
    		{
    			PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    		}

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    lundi 20 mars 2017 15:57
  • Bonjour,

    Cette écriture est ce qu'on appelle les "Operateurs conditionnels null" https://msdn.microsoft.com/fr-fr/library/dn986595.aspx.

    Pour résumé si la partie gauche de l'expression est null alors la suite de l'expression n'est pas évaluée.

    Dans votre cas PropertyChanged est une propriété de type "groupe de méthodes" (ou événement si vous préférez) qui est un objet que l'on peut invoquer (via Invoke) c'est à dire "exécuter" la méthode.

    Donc l'expression "PropertyChanged?.Invoke(...)" va exécuter l'événement via Invoke uniquement si PropertyChanged n'est pas null. En réalité le compilateur va écrire quasiment le même code que vous, mais à votre place.

    C'est un peu déconcertant au début, mais c'est réellement pratique et améliore la lisibilité du code en évitant de répéter constamment des blocs "if".

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    mardi 21 mars 2017 07:16

Toutes les réponses

  • Bonjour,

    Depuis C# 6.0 on peut simplifier les appels de délégué tel que dans votre cas. VS2015 et+ vous indique que c'est le cas.

    Quand vous vous positionnez sur ce votre code une ampoule apparaît à gauche de la ligne et en cliquant dessus un assistant vous permet de simplifier votre code (vous pouvez également utiliser la combinaison de touche "Ctrl + .").

    Normalement votre code devrait devenir quelque chose comme:

    		private void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
    		{
    			PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    		}

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    lundi 20 mars 2017 15:57
  • Merci bien pour la réponse Yan,

    Maintenant il faut que je vois a quoi correspond le ?.Invoke c'est assez particulier comme ecriture,

    si j'ai bien compris ? fait le test != null, et Invoke est une méthode de ? qui appel PropertyChanged avec les paramètres entre () si PropertyChanged est != null

    Cela simplifie ... pour le compilateur surement mais pas pour moi ;o)

    Merci encore Yan pour le temps passé à me répondre

    Cordialement


    Laurent

    lundi 20 mars 2017 18:25
  • Bonjour,

    Cette écriture est ce qu'on appelle les "Operateurs conditionnels null" https://msdn.microsoft.com/fr-fr/library/dn986595.aspx.

    Pour résumé si la partie gauche de l'expression est null alors la suite de l'expression n'est pas évaluée.

    Dans votre cas PropertyChanged est une propriété de type "groupe de méthodes" (ou événement si vous préférez) qui est un objet que l'on peut invoquer (via Invoke) c'est à dire "exécuter" la méthode.

    Donc l'expression "PropertyChanged?.Invoke(...)" va exécuter l'événement via Invoke uniquement si PropertyChanged n'est pas null. En réalité le compilateur va écrire quasiment le même code que vous, mais à votre place.

    C'est un peu déconcertant au début, mais c'est réellement pratique et améliore la lisibilité du code en évitant de répéter constamment des blocs "if".

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    mardi 21 mars 2017 07:16
  • Bonjour,

    Merci encore pour ces explications Yan, je vais étudié la 'chose'

    Cordialement


    Laurent

    mardi 21 mars 2017 10:28