solito eseguo guardia controllando in questo modo:Guardia controllo di lambda
public void doStuff(Foo bar, Expression<Func<int, string>> pred) {
if (bar == null) throw new ArgumentNullException();
if (pred == null) throw new ArgumentNullException();
// etc...
}
Ho visto questo controllo supplementare che assicura che il predicato è in realtà un lambda:
if (pred.NodeType != ExpressionType.Lambda) throw new ArgumentException();
Il ExpressionType
enum ha molte possibilità, ma non capisco come qualcuno di loro si applicherebbe perché ho pensato che il compilatore avrebbe permesso solo un lambda.
Q1: C'è un vantaggio? Facciamo un controllo accurato della guardia di tutti gli input, quindi questo aggiunge valore?
Q2: Esiste una penalità legata alle prestazioni, ovvero richiede più tempo rispetto a un normale controllo di tipo/limiti/null?
Sembra che Q1 sia vantaggioso se si * desidera * assicurarsi che la propria espressione sia di un certo tipo, piuttosto che solo null controllarla. – Glubus
@Glubus Potrebbe essere qualcosa di diverso da un lambda per cominciare? –
Sì. Le espressioni sono usate per descrivere e usare i meta-dati dei dati che sta trattenendo. 'Espressione << Func>' descrive un delegato che accetta un intero e restituisce una stringa, ma in realtà non definisce un'istanza di questo delegato. In questo modo puoi creare interi alberi di espressioni concatenandoli insieme. Leggi l'articolo mdsn sulla classe Expression. –
Glubus