Что означает выражение> декларации значит? - PullRequest
12 голосов
/ 20 января 2012

Может ли кто-нибудь объяснить следующую декларацию таким образом, чтобы передать значение выражения и как оно будет называться?

void Delete<T>(Expression<Func<T, bool>> expression) where T : class, new();

Я прочитал это как: Удалить объект типа T, передав лямбда-выражение, параметр которого является объектом типа T, который возвращает bool.

Также вы можете заменить Func<T, bool> expression на Predicate<T> expression

Ответы [ 4 ]

19 голосов
/ 20 января 2012

Этот метод, вероятно, является членом типа collection , да?

"Предикатом" является любое устройство, которое говорит "да" или "нет" на вопрос "является ли эта вещь членом этого набора?" Таким образом, предикат для набора «целые и даже положительные целые числа» будет x=> x > 0 && x % 2 == 0.

Этот метод, вероятно, имеет семантику "удалить из коллекции все члены коллекции, которые находятся в наборе, указанном предикатом".

Предикат передается методу в виде дерева выражений, которое является способом передачи структуры предиката таким образом, который можно анализировать во время выполнения и преобразовывать. Обычно он используется в сценариях, где «коллекция» фактически является базой данных, и запрос на удаление необходимо преобразовать в запрос на языке запросов базы данных и отправить по сети.

9 голосов
/ 20 января 2012

Первый - это метод, который принимает дерево выражений (необязательно созданное из дерева лямбда-выражений). Дерево выражений представляет собой выражение, которое принимает T и возвращает bool. T должен быть ссылочным типом с конструктором без параметров.

Что касается семантического значения - это зависит от документации / реализации.

Важно различать лямбда-выражение, которое является одним из способов создания дерева выражений, и само дерево выражений.

Что касается того, может ли он использовать Predicate<T> вместо - возможно. Это зависит от того, что реализация делает с этим. Они, конечно, представляют один и тот же делегат подпись , но вы не можете тривиально преобразовать два типа дерева выражений.

1 голос
/ 20 января 2012

этот метод получает в качестве параметра дерево выражений функции, которая получает объект с открытым конструктором без параметров и возвращает логическое значение.

Подробнее о деревьях выражений и их использовании можно прочитать здесь:http://msdn.microsoft.com/en-us/library/bb397951.aspx

0 голосов
/ 20 января 2012

Хотя сигнатура метода выглядит для меня недопустимой, по сути, вы передаете дерево выражений (это может быть не LambdaExpression тип, поскольку Expression является абстрактным базовым классом для всех типов выражений).

Ограничения типа указывают, что T должен быть ссылочным типом (наследовать от класса, не может быть типом значения (read: struct)) и должен также иметь определенный конструктор по умолчанию.

EDITсм. ответ Джона ниже, он исправил подпись и оттуда правильно ответил на вопрос, предоставив больше информации, чем я.

...