Как работает следующая строка кода, которая использует выражение Linq без аргумента? (это() =>)
RaisePropertyChanged(() => FullName);
Подпись RasiePropertyChanged:
protected virtual void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpression);
Спасибо.
Это просто выражение, которое возвращает строку FullName.
На основе подписи вы можете увидеть, что она возвращает Func<string>
которая совпадает с
private string SomeStringMethod()//string comes from the <T> being string
{
return FullName;
}
Эта лямбда:
() => FullName
эквивалентен этому именованному методу:
private string SomeMethod()
{
return FullName;
}
Пустые круглые скобки просто не означают никаких параметров.
Lambda () => FullName
фактически преобразуется в частный статический метод, как упоминалось выше.
Когда код С# компилируется на промежуточном языке, все делегаты (Func - это не что иное, как делегат, инкапсулирующий метод, который возвращает некоторый тип T (в вашем случае, строку) и не принимает входных параметров).
Итак, в основном, лямбда эквивалентна:
private static string AMethod()
{
return FullName;
}
Если вы не закрываете какую-либо переменную в коде, в этом случае компилятор будет генерировать вложенный класс, чтобы сохранить ссылку на переменную, под которой вы закрываете.