Utilizzare eventi dove appropriato

Aggiornamento: novembre 2007

TypeName

UseEventsWhereAppropriate

CheckId

CA1030

Category

Microsoft.Design

Breaking Change

Non sostanziale

Causa

Un nome di metodo pubblico, protetto o privato inizia con uno dei seguenti elementi:

  • AddOn

  • RemoveOn

  • Fire

  • Raise

Descrizione della regola

Questa regola rileva i metodi che presentano nomi comunemente utilizzati per gli eventi. Gli eventi seguono il modello di progettazione Observer o Publish-Subscribe, sono utilizzati quando una modifica dello stato in un oggetto deve essere comunicata ad altri oggetti. Se un metodo viene chiamato in risposta a una modifica dello stato chiaramente definita, il metodo deve essere richiamato da un gestore eventi. Gli oggetti che chiamano il metodo devono generare eventi anziché chiamare direttamente il metodo.

Alcuni esempi comuni di eventi si trovano nelle applicazioni di interfaccia utente in cui un'azione dell'utente quale la scelta di un pulsante causa l'esecuzione di un segmento di codice. Il modello di evento .NET Framework non si limita alle interfacce utente, deve essere utilizzato ogni volta che è necessario comunicare modifiche dello stato a uno o più oggetti.

Correzione di violazioni

Se il metodo viene chiamato quando lo stato di un oggetto viene modificato, è opportuno provare a modificare la progettazione in modo da utilizzare il modello di evento .NET Framework.

Esclusione di avvisi

Escludere un avviso da questa regola se il metodo non funziona con il modello eventi .NET Framework.

Esempio

Nell'esempio seguente viene illustrato un metodo che tenta di comunicare un cambiamento di stato (in questo caso che il tipo dichiarante, Book, è stato chiuso) richiamando un delegato.

using System;

namespace Samples
{    
    public delegate void ClosedCallback(Book book);

        public class Book    
    {         
        private ClosedCallback _ClosedCallback;

             // Violates this rule
             public void AddOnClosed(ClosedCallback callback)
             {
                  _ClosedCallback = callback;
             }

         public void Close()
         {
              _ClosedCallback(this);
         }
    }
}

La classe seguente corregge l'esempio precedente passando al modello eventi di .NET Framework.