Delegato vs Metodo

2

C'è qualche vantaggio nell'utilizzare i delegati invece dei metodi? Ad esempio:

public void LoginAuthenticate(object sender, AuthenticateEventArgs e)
{
 if (Membership.ValidateUser(lgUserLogin.UserName, lgUserLogin.Password))
     {
       Func<string, string> getDestinationPage = (userLogin) => { //definition };

     e.Authenticated = true;
     lgUserLogin.DestinationPageUrl = getDestinationPage(lgUserLogin.UserName);
  }

else
   {
    Action<string> invalidLogin = (msg) =>
     {
       lgUserLogin.FailureText = string.IsNullOrWhiteSpace(msg) ? "Invalid login" : msg;
       e.Authenticated = false;
     };

     MembershipUser user = Membership.GetUser(lgUserLogin.UserName);
      if (user != null)
       {
        if (user.IsLockedOut)
         {
           invalidLogin("User has been blocked");

         }
         else if (!user.IsApproved)
          {
           invalidLogin("User is not activated");
          }
          else
           {  
             invalidLogin(null);  
           }

       }

       else
         {
           invalidLogin(null);
         }
   }
}

Se I getDestinationPage definisce come %codice% e private string getDestinationPage(string login){...} come invalidLogin

offre vantaggi?

    
posta Alex Maslakov 20.07.2011 - 11:43
fonte

5 risposte

3

Nel tuo caso rende il codice più pulito e più leggibile per usare i metodi. Non vi è alcun vantaggio nell'utilizzo di delegati come questo.

Il tuo codice sarà simile a questo:

private string getDestinationPage(string userLogin)
{
    // definition
}

private void invalidLogin(string msg)
{
    lgUserLogin.FailureText = string.IsNullOrWhiteSpace(msg)
                              ? "Invalid login"
                              : msg;
}

public void LoginAuthenticate(object sender, AuthenticateEventArgs e)
{
    if (Membership.ValidateUser(lgUserLogin.UserName, lgUserLogin.Password))
    {
        e.Authenticated = true;
        lgUserLogin.DestinationPageUrl = getDestinationPage(lgUserLogin.
                                                              UserName);
    }

    else
    {
        e.Authenticated = false;
        MembershipUser user = Membership.GetUser(lgUserLogin.UserName);
        if (user != null)
        {
            if (user.IsLockedOut)
            {
                invalidLogin("User has been blocked");
            }
            else if (!user.IsApproved)
            {
                invalidLogin("User is not activated");
            }
            else
            {
                invalidLogin(null);
            }
        }
        else
        {
            invalidLogin(null);
        }
    }
}
    
risposta data 20.07.2011 - 11:47
fonte
1

I metodi sono fondamentalmente "ciò che l'oggetto può fare". I delegati sono il meccanismo per decidere "cosa fare" e "farlo" in posti diversi. È come prendere decisioni premature confrontandole con if (a) then b (); else c ();

    
risposta data 20.07.2011 - 11:51
fonte
1

Lambdas sono metodi anonimi. Li usi soprattutto nei casi in cui desideri passare un po 'di codice in un metodo come parametro.

Ad esempio, tutti i metodi LINQ funzionano con lambda perché

var result = list.Where(x => x % 2 == 0);

è molto più conciso allora

var result = list.Where(IsEven);

public bool IsEven(int i)
{
    return i%2 == 0;
}

Un altro utilizzo sono gli alberi di espressione.

Nel tuo caso, un metodo normale è la scelta migliore per quanto riguarda la leggibilità / manutenibilità.

    
risposta data 20.07.2011 - 11:50
fonte
1

È possibile accedere (acquisire) le variabili locali della funzione chiamante LoginAuthenticate da getDestinationPage e invalidLogin . invalidLogin cattura e . Se rendi questo un metodo, devi passare e come parametro aggiuntivo.

Se non ti serve, è davvero più semplice dichiarare un metodo privato.

    
risposta data 20.07.2011 - 11:50
fonte
0

Se hai intenzione di lavorare con scenari diversi in cui gli utenti possono essere reindirizzati a diverse pagine di destinazione (programmaticamente), e ci sono diversi metodi che gestiscono questo a seconda della situazione con alcuni condizionali, ecc. allora i delegati hanno il vantaggio di è possibile modificare il metodo da chiamare solo assegnando il nuovo metodo all'istanza delegata. Oltre a questo, non vedo alcun punto.

    
risposta data 20.07.2011 - 11:48
fonte

Leggi altre domande sui tag