2009-08-21 11 views

Respuesta

33

Sí, se llaman delegados en .NET, no tipos de funciones.

Utiliza la palabra clave reservada delegate para definir nuevas, y hay muchas que están predefinidas en las bibliotecas de clases.

para definir uno que coincida con su ejemplo:

public delegate void DoSomethingDelegate(Object param1, Object param2); 

así asignarle:

DoSomethingDelegate f = DoSomething; 
f(new Object(), new Object()); 

También hay dos tipos genéricos de tipos de delegados definidos en la biblioteca de clases de base, uno de los métodos que se devuelve un valor, y uno para los que no, y vienen con variaciones sobre la cantidad de argumentos que tiene.

Los dos son Func<..> para los métodos que devuelven un valor, y Action<..> para los métodos que no lo hacen.

En su caso, esto funcionaría:

Action<Object, Object> f = DoSomething; 
f(new Object(), new Object()); 

Tenga en cuenta que en este último caso, usted no tiene que declarar DoSomethingDelegate.

+2

Func y Action son muy utilizados en Linq. – Dykam

+0

El problema es que uno no puede crear su propia implementación de Func, por lo que no acaba de cortar, por desgracia. – Rolf

6

Ellos (las referencias a funciones) son llamados delegados

Aquí está una cartilla maravillosa: http://www.akadia.com/services/dotnet_delegates_and_events.html

+0

¿Cómo se implementan? –

+2

Son clases completas en segundo plano, que los constructores aceptan una función, pero C# 2 y 3 han eliminado totalmente ese hecho, lo cual es algo bueno. – Dykam

8

El concepto de delegates en. NET es exactamente lo que estás buscando.

Hay ejemplos en la página vinculada, así como muchos tutoriales y explicaciones detalladas de cómo se implementan y se utilizan. ¡Atrás de Google!

5

Sí, hay punteros de función seguros llamados Delegates. Por ejemplo ...

void Main() 
{ 
    object o1 = new object(); 
    object o2 = new object(); 

    Action<object, object> act = DoSomething; 
    act(o1, o2); 
} 

private void DoSomething(object o1, object o2) 
{ 
    // do that thang 
} 

Action<T> es el construido en el delegado ...

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

También hay funciones anónimas llamadas Lambda Expressions. Por ejemplo ...

List<int> lst = new List<int>() { 1, 2, 3, 4, 5 }; 
    var res = lst.Where(l => l > 3); 

El argumento del método Where es una expresión Lambda. Eche un vistazo al blog de Eric White para una gran discusión sobre este tema: Query Composition Using Functional Programming Techniques in C# 3.0.

4

Creo que está buscando un tipo de delegado de C#.

delegate void DoSomethingDelegate(object obj1, object obj2); 

    void DoSomething(object a, object b) 
    { 
    } 

    void RunDoSomething() 
    { 
     //use your delegate 
     DoSomethingDelegate d = new DoSomethingDelegate(DoSomething); 
     d(new object(), new object()); 

     //alernatively, use the built in generic version 
     Action<object, object> d2 = new Action<object, object>(DoSomething); 
     d2(new object(), new object()); 

    } 
Cuestiones relacionadas