zwykle wykonać osłonę sprawdzenie tak:Straż sprawdzanie lambdas
public void doStuff(Foo bar, Expression<Func<int, string>> pred) {
if (bar == null) throw new ArgumentNullException();
if (pred == null) throw new ArgumentNullException();
// etc...
}
Widziałem tę dodatkową kontrolę, która gwarantuje, że orzeczenie jest faktycznie lambda:
if (pred.NodeType != ExpressionType.Lambda) throw new ArgumentException();
ExpressionType
enum ma wiele możliwości, ale nie rozumiem, jak którykolwiek z nich miałby zastosowanie, ponieważ założyłem, że kompilator zezwala tylko na lambdę.
Q1: Czy jest to korzystne? Dokładnie sprawdzamy wszystkie wejścia, więc czy to dodaje wartości?
Q2: Czy jest kara za wydajność - np. Czy trwa dłużej niż zwykłe sprawdzanie typu/granice/zero?
Wydaje się, że Q1 przynosi ci korzyści, jeśli * chcesz *, aby upewnić się, że twoje wyrażenie jest określonego typu, a nie tylko zerowe sprawdzanie. – Glubus
@Glubus Czy jednak może być coś innego niż lambda? –
Tak. Wyrażenia służą do opisywania i używania metadanych danych, które przechowują. 'Wyrażenie << Func>' opisuje delegata, który akceptuje liczbę całkowitą i zwraca ciąg, ale nie definiuje faktycznie instancji tego delegata. W ten sposób możesz tworzyć całe drzewa wyrażeń, łącząc je ze sobą. Sprawdź artykuł mdsn dotyczący klasy Expression. –
Glubus