Se si desidera creare delegati personalizzati, utilizzare la parola chiave delegato in lettere minuscole.Parola chiave delegato o delegato
Cosa si può fare con la classe di delegati effettiva? A cosa serve questo? Non capisco la differenza esatta.
Se si desidera creare delegati personalizzati, utilizzare la parola chiave delegato in lettere minuscole.Parola chiave delegato o delegato
Cosa si può fare con la classe di delegati effettiva? A cosa serve questo? Non capisco la differenza esatta.
Da http://msdn.microsoft.com/en-us/library/system.delegate.aspx:
La classe
Delegate
è la classe base per i tipi di delegati. Tuttavia, solo il sistema e i compilatori possono derivare esplicitamente dalla classeDelegate
o dalla classeMulticastDelegate
. Non è inoltre ammesso il di derivare un nuovo tipo da un tipo delegato. La classeDelegate
non è considerata un tipo delegato ; è una classe utilizzata per i tipi di delegati derivati da .maggior parte dei linguaggi implementare una parola chiave
delegate
, e compilatori per quelle lingue sono in grado di derivare dalla classeMulticastDelegate
; pertanto, gli utenti di devono utilizzare la parola chiave fornita dalla lingua.
Il vantaggio della classe Delegate è che è la classe base per tutti i tipi di delegati in .Net. Avere un metodo che prende un'istanza di questa classe consente di operare genericamente su tutti i tipi di delegati. Questo è il motivo per cui operazioni come ISynchronizedInvoke.Invoke usano questo come parametro.
Si noti tuttavia che invocare un delegato in questo modo è ritardato e (di conseguenza) più lento. –
La parola chiave delegata serve al compilatore per fare un po 'di magia per te. Quando dichiari un nuovo delegato con una firma personalizzata,
Così ora quando si chiama delObject(args)
- il compilatore traduce che per delObject.Invoke(args)
La classe di base Delegate fornisce alcune funzionalità come
Il compilatore C# vieta di derivare dal Delegato in modo esplicito nel codice .. è necessario utilizzare la parola chiave delegato.
+1: in particolare per dire che "il compilatore crea un nuovo tipo per te derivato da MulticastDelegate" . Quindi, per impostazione predefinita, i delegati che creiamo sono tutti delegati Multicast – A9S6
Chiaramente. Mi piace la tua risposta. –
'il compilatore crea un nuovo tipo per te derivato da MulticastDelegate' Non sono sicuro di questo. Secondo http://msdn.microsoft.com/en-us/library/system.delegate.aspx 'Tuttavia, solo il sistema ei compilatori possono derivare esplicitamente dalla classe Delegate o dalla classe MulticastDelegate. Si noti la parola chiave" ** o ** " –
Da una prospettiva di implementazione, la classe Delegate definisce i campi utilizzati per rappresentare il puntatore di funzione di un delegato e la classe MultiCastDelegate fornisce la funzionalità di base utilizzata dagli eventi. Inoltre, come indicato da altre persone, Delegato fornisce il metodo "DynamicInvoke" che consente di richiamare qualsiasi delegato.
Un'altra cosa semplice si può fare con delegate
parola chiave è creare delegati in linea, senza dover dichiarare loro, per esempio:
// constructor
public Form1()
{
this.Load += delegate(object sender, EventArgs e)
{
// Form1_Load code goes right here
}
}
La sintassi lambda C# 3.0 è molto meno dettagliata. –
Una delle cose che la classe Delegate
può essere utilizzato per è un maggiore controllo quando si richiama gestori di eventi. Ad esempio, con l'elaborazione di eventi normale, un'eccezione in qualsiasi gestore di eventi impedirà il richiamo di eventuali gestori di eventi successivi. È possibile modificare tale comportamento utilizzando la classe Delegate
per richiamare manualmente ciascun gestore di eventi.
using System;
namespace DelegateClass
{
class EventSource
{
public event EventHandler TheEvent;
internal void RaiseEvent1()
{
EventHandler handler = TheEvent;
if (handler != null)
handler(this, EventArgs.Empty);
}
internal void RaiseEvent2()
{
EventHandler handler = TheEvent;
if (handler == null)
return;
Delegate[] handlers = handler.GetInvocationList();
foreach (Delegate d in handlers)
{
object[] args = new object[] { this, EventArgs.Empty };
try
{
d.DynamicInvoke(args);
}
catch (Exception ex)
{
while (ex.InnerException != null)
ex = ex.InnerException;
Console.WriteLine(ex.Message);
}
}
}
}
class Program
{
static void Handler1(object sender, EventArgs e)
{
Console.WriteLine("Handler1");
}
static void Handler2(object sender, EventArgs e)
{
Console.WriteLine("Handler2");
throw new InvalidOperationException();
}
static void Handler3(object sender, EventArgs e)
{
Console.WriteLine("Handler3");
}
static void Main(string[] args)
{
EventSource source = new EventSource();
source.TheEvent += Handler1;
source.TheEvent += Handler2;
source.TheEvent += Handler3;
try
{
source.RaiseEvent1();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.WriteLine("-------------------");
source.RaiseEvent2();
}
}
}
Nice fetch da MSDN;) – Xian
http://msdn.microsoft.com/en-us/library/system.delegate.aspx – Xian