2009-08-21 11 views

risposta

33

Sì, si chiamano delegati in .NET, non in tipi di funzione.

Si utilizza la parola chiave riservata delegate per definirne di nuovi, e ce ne sono molti che sono predefiniti nelle librerie di classi.

Per definire quello che corrisponde al tuo esempio:

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

Poi per assegnarlo:

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

Ci sono anche due tipi generici di tipi delegati definiti nella libreria di classi di base, uno per i metodi che restituire un valore, e uno per quelli che non lo fanno, e vengono con variazioni sul numero di argomenti che hai.

I due sono Func<..> per i metodi che restituiscono un valore e Action<..> per i metodi che non lo sono.

Nel vostro caso, questo dovrebbe funzionare:

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

Si noti che in quest'ultimo caso, non è necessario dichiarare DoSomethingDelegate.

+2

Func e Action sono molto utilizzati in Linq. – Dykam

+0

Il problema è che non è possibile creare la propria implementazione di Func, in modo che non lo tagli, purtroppo. – Rolf

8

Il concetto di delegates in. NET sono esattamente ciò che stai cercando.

Ci sono esempi nella pagina collegata, così come molti tutorial e spiegazioni approfondite su come sono implementati e utilizzati. Google via!

5

Sì, ci sono dei puntatori di funzione di tipo sicuro denominati Delegates. Per esempio ...

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> è il costruito nel delegato ...

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

Ci sono anche funzioni anonime chiamate Lambda Expressions. Ad esempio ...

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

L'argomento del metodo Where è un'espressione lambda. Guarda il blog di Eric White per una grande discussione su questo argomento: Query Composition Using Functional Programming Techniques in C# 3.0.

4

Penso che stiate cercando un tipo di delegato 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()); 

    } 
Problemi correlati