2012-02-11 17 views
24

Hay algunas preguntas similares pero no exactamente como la mía.void Func sin argumentos

¿Hay un Func equivalente para una función sin un valor de retorno (es decir, vacío) y sin parámetros?

La pregunta relacionada es Func not returning anything? pero esto no responde por un tipo de vacío.

(lo necesito para solicitar acciones de mi modelo de vista a mi vista).

+0

@Anthony Pegram: Pero tienen que rellenar un tipo en una acción y de vacío no es una posibilidad (voy a editar mi pregunta, he cometido un error). –

Respuesta

37

Su redacción es confusa. Quizás quiera decir "una función sin , un tipo de retorno y sin parámetros". Simplemente hay System.Action.

Action action =() => Console.WriteLine("hello world"); 
action(); 

Desde su comentario:

Pero tengo que rellenar un tipo <T> en una acción y de vacío no es una posibilidad (voy a editar mi pregunta, he cometido un error).

Esto es un malentendido. La T en el delegado de Acción es una entrada . El vacío es la salida . Un delegado de acción es inherentemente un delegado que devuelve el vacío. La T es el tipo de entrada sobre la cual puede actuar, los parámetros que usted luego proporcionaría con argumentos.

En cualquier caso, como muestran esta y otras respuestas, puede tener un delegado de Acción sin ningún T, un delegado que no toma entradas.

+3

Sí, me olvidé completamente de que el es opcional. Gracias (y otros) por la ayuda. –

+0

@anthony ¿Cómo puedo hacer esto con .NET Framework anterior 3.5. No hay acción de delegado. Solo delegue la acción . –

+0

@ ph1983, antes de C# 3, utilizaría delegados, aunque C# 2.0 agregó soporte para * métodos anónimos *. No tengo una pregunta de ejemplo de inmediato, pero puede leer sobre la característica en [MSDN] (http://msdn.microsoft.com/en-us/library/0yw3tz5k.aspx). –

3

Lo que estás buscando es una acción. No requiere parámetros, y no devuelve ningún valor.

13

Sí, hay diferentes sobrecargas de Action tomando un número diferente de parámetros de entrada y teniendo un tipo de retorno void.

Action    public delegate void Action() 
Action<T>    public delegate void Action<T>(T obj) 
Action<T1,T2>   public delegate void Action<T1,T2>(T1 arg1, T2 arg2) 
Action<T1,T2,T3>  public delegate void Action<T1,T2,T3>(T1 arg1, T2 arg2, T3 arg3) 
... 

La primera línea es lo que estás buscando.

Las versiones más nuevas de Framework han agregado sobrecargas con aún más argumentos. número máximo de argumentos:

  • .NET Framework 2.0:    
  • .NET Framework 3.5:    
  • .NET Framework 4.0:
  • Silverlight:                                    

acciones tienen siempre un tipo de devolución void. Un tipo de devolución void no necesita y no se puede especificar como parámetro de tipo genérico. Por el contrario, los delegados Func definir los tipos de retorno "reales" y tener siempre al menos un parámetro de tipo genérico para el tipo de retorno:

Func<TResult>   public delegate TResult Func<TResult>() 
Func<T,TResult>   public delegate TResult Func<T,TResult>(T arg) 
Func<T1,T2,TResult>  public delegate TResult Func<T1,T2,TResult>(T1 arg1, T2 arg2) 
... 

.NET Framework 4.0 ha añadido in y out modificadores de tipo genérico parámetros para contravarianza y covarianza. Ver: Covariance and Contravariance in Generics. Ejemplos:

public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2) 

public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2)