2017-10-17 6 views
1

J'essaie actuellement de m'apprendre à utiliser les événements, mais je n'arrive jamais à faire en sorte que tout fonctionne correctement.Événements d'apprentissage

La classe à l'événement de codage ressemble à ceci:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace EventsPractice 
{ 
    public delegate void myEventHandler(string newValue); 

    public class EventExample 
    { 
     private string _value; 
     public event myEventHandler valueChanged; 

     public string val 
     { 
      set 
      { 
       _value = value; 
       valueChanged(_value); 
      } 
     } 

     static void myEvt_valueChanged(string newValue) 
     { 
      Console.WriteLine("The value changed to {0}", newValue); 
     } 
    } 
} 

Ma classe de programme ressemble à ceci:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using EventsPractice; 

namespace EventsPractice 
{ 
    public class Program 
    { 
     static void Main(string[] args) 
     { 
      EventExample myEvt = new EventExample(); 

      myEvt.valueChanged += myEventHandler(myEvt_valueChanged); 

      string str; 
      do 
      { 
       str = Console.ReadLine(); 
       if (!str.Equals("exit")) 
        myEvt.val = str; 
      } while (!str.Equals("exit")); 

     } 
    } 
} 

Les erreurs que je reçois sont:

« Erreur 1 ' EventsPractice.myEventHandler 'est un' type 'mais est utilisé comme une' variable 'C: \ Users \ Administrateur \ Documents \ Visual Studio 2010 \ Projects \ EventsPractice \ EventsPractice \ Program.cs 15 35 ÉvénementsPractice "

Erreur 2 Le nom 'myEvt_valueChanged' n'existe pas dans le contexte actuel C: \ Users \ Administrateur \ Documents \ Visual Studio 2010 \ Projects \ EventsPractice \ EventsPractice \ Program.cs 15 50 EventsPractice

Je ne suis pas sûr ce qui me manque ou où je me suis trompé. Toute aide serait appréciée.

Répondre

0

à la main droite de la += vous devez mettre une méthode (ou un lambda) qui ont la même signature que le delegate, quelque chose comme:

myEvt.valueChanged += (val) => { Console.WriteLine("Value is now {0}", val); } 

ou

private void SomeMethod(string val) { 
    Console.WriteLine("Value is now {0}", val); 
} 

myEvt.valueChanged += SomeMethod; 
1

Le La syntaxe d'abonnement à un événement nécessite que vous fournissiez une instance d'un objet délégué sur le côté droit de l'opérateur +=. L'expression myEventHandler(myEvt_valueChanged); n'a pas de sens du tout, peu importe si elle fournit l'instance de délégué nécessaire.

L'autre problème est que l'identificateur myEvt_valueChanged n'est pas valide seul, lorsque vous essayez de l'utiliser. La méthode de ce nom est déclarée dans une classe complètement différente, et doit donc être qualifiée par le nom de la classe si vous voulez l'utiliser en dehors de cette classe. De cette façon, le compilateur peut dire où trouver la méthode.

La façon la plus simple de changer votre code serait d'ajouter l'opérateur new, comme ceci:

myEvt.valueChanged += new myEventHandler(EventExample.myEvt_valueChanged); 

Cela va créer explicitement une instance du type délégué myEventHandler, en utilisant la méthode myEvt_valueChanged de la classe EventExample. Cependant, C# offre une syntaxe plus concise dans laquelle il déduire le type de délégué et new opérateur en votre nom, en fonction de la main gauche de l'expression:

myEvt.valueChanged += EventExample.myEvt_valueChanged; 

Notez que lorsque vous écrivez cette façon , il fait exactement la même chose que si vous aviez écrit le tout explicitement. C'est juste que le compilateur remplit les parties évidentes pour vous.

Enfin, je soulignerai que les événements sont le plus souvent utilisés en souscrivant une méthode et non de la même classe que celle où l'événement est déclaré.Votre exemple ci-dessus serait plus typique si la méthode était myEvt_valueChanged dans la Program classe, et si elle y avait la place, vous auriez pas besoin de spécifier le nom de classe quand il souscrivant à l'événement:

myEvt.valueChanged += myEvt_valueChanged;