2010-11-01 11 views
11

Qual è il nome del delegato predefinito in C# che non accetta parametri e restituisce void? Ricordo che esisteva un tale delegato ma non ricordo il suo nome.Delegato predefinito in C#

+7

Qual è il nome di quel motore di ricerca che è possibile utilizzare per trovare le cose con? ;) http://www.google.se/search?q=c%23+delegate+no+parameters+returns+void – Guffa

+1

@Guffa: che ora torna a questa domanda ... – davidg

+0

@davidg: Che di solito accade dopo pochi minuti, indipendentemente dal fatto che ci siano o meno risposte utili. Solo perché qualcosa appare in un risultato di Google non garantisce che ci siano informazioni utili lì ... – Guffa

risposta

7

Ci sono molti di questi delgati, ma penso che stiate cercando Action. Un'altra opzione è MethodInvoker (in System.Windows.Forms).

+2

+ 1 per Azione. –

+0

Solo per la versione 3.5 e successive? Ce ne sono per 2.0? – Tuxedo

+0

@Tuxedo: 'MethodInvoker' è in circolazione dal 1.1. Se vuoi qualcosa nello spazio dei nomi 'System' c'è il' CrossAppDomainDelegate', ma il suo nome è così specifico che probabilmente sembrerà un po 'strano per un uso più generale. –

12

Prima di .NET 3.5, era abbastanza comune per dichiarare il proprio. Ora, Action è un buon candidato, ma è stato comunemente utilizzato ThreadStart (abbastanza confusamente), oppure MethodInvokerse si stava già facendo riferimento a winform.

Un test rapido (nota, in esecuzione in .NET 4.0, utilizzando solo alcune librerie - quindi non esaustivo):

var qry = from asm in AppDomain.CurrentDomain.GetAssemblies() 
      from type in asm.GetTypes() 
      where type.IsSubclassOf(typeof(Delegate)) 
      let method = type.GetMethod("Invoke") 
      where method != null && method.ReturnType == typeof(void) 
      && method.GetParameters().Length == 0 
      orderby type.AssemblyQualifiedName 
      select type.AssemblyQualifiedName; 
foreach (var name in qry) Console.WriteLine(name); 

mostra alcuni più candidati:

System.Action, mscorlib... 
System.CrossAppDomainDelegate, mscorlib... 
System.IO.Pipes.PipeStreamImpersonationWorker, System.Core... 
System.Linq.Expressions.Compiler.LambdaCompiler+WriteBack, System.Core... 
System.Net.UnlockConnectionDelegate, System... 
System.Runtime.Remoting.Contexts.CrossContextDelegate, mscorlib... 
System.Threading.ThreadStart, mscorlib... 
System.Windows.Forms.AxHost+AboutBoxDelegate, System.Windows.Forms... 
System.Windows.Forms.MethodInvoker, System.Windows.Forms... 
+5

Voterò per alternare AxHost.AboutBoxDelegate e LambdaCompiler.WriteBack. Inizierò immediatamente a rippare gli usi di "Azione" dal mio codice. –

3

I può essere Interpretariato la tua domanda in modo diverso a tutti gli altri, ma:

Se stai pensando al delegato da utilizzare per la gestione degli eventi, la convenzione è quella di utilizzare EventHandler. Questo delegato non accetta i parametri 'no', ma è essenzialmente privo di informazioni.

2

In .net 2.0 il delegato MethodInvoker è il modo consigliato. È il più generico. Come suggerisce il nome, invoca un metodo. Altri potrebbero avere le stesse proprietà che hai descritto, ma hanno un nome diverso che suggerisce altri usi o usi molto specifici in aree specifiche.