2010-11-01 10 views
11

¿Cuál es el nombre del delegado predeterminado en C# que no toma parámetros y devuelve vacío? Recuerdo que existía tal delegado, pero no recuerdo su nombre.Delegado predeterminado en C#

+7

¿Cuál es el nombre de ese motor de búsqueda que puede usar para encontrar cosas? ;) http://www.google.se/search?q=c%23+delegate+no+parameters+returns+void – Guffa

+1

@Guffa: Lo que ahora pasa a señalar esta pregunta ... – davidg

+0

@davidg: Eso generalmente ocurre después de solo unos minutos, independientemente de si hay alguna respuesta útil o no. El hecho de que algo aparezca en un resultado de google no garantiza que haya información útil allí ... – Guffa

Respuesta

7

Existen muchas de estas desasas, pero creo que usted está buscando Action. Otra opción es MethodInvoker (en System.Windows.Forms).

+2

+ 1 de acción. –

+0

¿Es solo para la versión 3.5 y superior? ¿Hay alguno para 2.0? – Tuxedo

+0

@Tuxedo: 'MethodInvoker' ha estado presente desde 1.1. Si desea algo en el espacio de nombres 'System', está el' CrossAppDomainDelegate', pero su nombre es muy específico, por lo que probablemente parezca un poco extraño para un uso más general. –

12

Antes de .NET 3.5, era bastante común para declarar su propio. Ahora, Action es un buen candidato, pero ThreadStart se usó comúnmente (bastante confusa), o MethodInvokersi ya estaba haciendo referencia a winforms.

Una prueba rápida (nota, que se ejecuta en .NET 4.0, utilizando sólo algunas bibliotecas - por lo que no es exhaustiva):

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); 

muestra algunos más candidatos:

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

Voto por alternar entre AxHost.AboutBoxDelegate y LambdaCompiler.WriteBack. Comenzaré a extraer usos de "Acción" de mi código de inmediato. –

3

me puede interpretar su pregunta de manera diferente para todos los demás, pero:

Si está pensando en el delegado para el manejo de eventos, la convención es usar EventHandler. Este delegado no toma los parámetros 'no', pero esencialmente no tiene información.

2

En .NET 2.0 el delegado MethodInvoker es la manera recomendada. Es el más genérico. Como su nombre lo sugiere, invoca un método. Otros pueden tener las mismas propiedades que usted describió, pero tienen un nombre diferente que sugiere otros usos o usos muy específicos en áreas específicas.

Cuestiones relacionadas