Дерево выражений является объектно-ориентированным представлением выражения во время выполнения. Компилятор C # может автоматически записывать ограниченное подмножество выражений в виде Expression<>
экземпляров через лямбду - то есть
Func<string> anonMethod = () => "abc"; // this is a delegate
Expression<Func<string>> expression = () => "abc"; // this is an expression
Выше будет иметь ConstantExpression
; ваш пример будет иметь ConstantExpression
, который захватывает this
, и MemberExpression
, который оборачивает эту константу (this
) и член (.Name
). Затем во время выполнения он находит MemberExpression
, который имеет MemberInfo
, который имеет Name
. Он может даже иметь класс захвата от ConstantExpression
до , от MemberExpression
до this
(как поле в классе захвата) и , затем a MemberExpression
до .Name
.
Разница невелика, но выражение может быть разобрано и проверено во время выполнения - что очень важно для LINQ. Однако: хотя компилятор может записать их, они не могут свободно проверять; они тоже стоили.
ИМО, возможно придерживайтесь:
public string Name
{
get { return _name; }
set { SomeSimpleNotifyMethod(ref _name, value, this, "Name"; }
}
это проще и быстрее (очевидно, изменяя метод так, чтобы он брал строку, которую он передает событию).