2010-10-19 17 views
6

Sono in grado di compilare il codice che include questo:C#; fare un nuovo delegato senza dichiarare il metodo separatamente?

OperationDelegate myOpDelegate; 
static OperatorDefinition[] definitions ={ 
       new OperatorDefinition("+",2,3,true, new OperationDelegate(OperationAdd)), 
      }; 
delegate double OperationDelegate(double[] args); 
static double OperationAdd(double[] args) 
      { 
       return args[0] + args[1]; 
      } 

ma penso che il mio codice sarà più pulito se potevo fare qualcosa di più simile a questo:

OperationDelegate myOpDelegate; 
static OperatorDefinition[] definitions ={new OperatorDefinition("+",2,3,true, new OperationDelegate({return args[0]+args[1]}))}; 
delegate double OperationDelegate(double[] args); 

perché voglio definire tutto su ogni OperatorDefinition in un singolo posto, piuttosto che definire le funzioni separatamente. C'è un modo per farlo in C#?

(qualsiasi altra critica circa il mio codice sarebbe il benvenuto, troppo)

+1

provare espressioni lambda ... sono ordinate, pulite e concise. – explorer

risposta

8

Guardare in metodi anonimi ... per esempio questo: C# - Anonymous delegate

+1

Grazie; solo conoscendo il termine "delegato anonimo" mi permetto di trovare molti esempi molto velocemente. – divider

+0

"Non so cosa non so" ~ I 'odio' quando mi imbatto in quello. Sono contento di aver trovato ciò che cercavi @divider – jcolebrand

6

È possibile utilizzare le espressioni lambda come da Net 3.5:

static OperatorDefinition[] definitions ={ 
    new OperatorDefinition("+",2,3,true, 
     args => args[0] + args[1]) 
    }; 

Nella tua OperatorDefinition costruttore, ultimo parametro dovrebbe essere di tipo Func<double[],double>

See : http://msdn.microsoft.com/en-us/library/bb397687.aspx

+0

Ho finito con "new OperatorDefinition (" * ", 2,4, true, delegate (double [] args) {return args [0] * args [1];}"; is questo è peggio del tuo? – divider

+0

È una questione di gusti - penso che Lambda sia più breve e più leggibile – Tor

+0

Grazie per l'aiuto, ma il collegamento a MSDN è stato troncato. – divider

Problemi correlati