2016-05-17 2 views
0

Я читал о Web API 2 и Entity Framework, где я наткнулся через эту линию:Что это за линия? X = Y => Z (Y)

this.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); 

Я посмотрел оператор => и обнаружил, что у него есть что-то делать с лямбда, хотя я все еще не совсем уверен, как он вписывается или что здесь происходит. Кто-нибудь может мне помочь? Что происходит в этой строке?

+1

Это называется _Lambda Expression_ , он был введен в C# 3 и в основном является более простым способом создания экземпляров делегата. – chomba

ответ

2

Свойство имеет тип Action<string>. Это означает, что это delegate, который берет строку и не имеет возвращаемого значения (т. Е. Ее тип возврата - void). Таким образом, эта строка присваивает свойству Log анонимную функцию, которая принимает значение string и записывает его в окно отладчика.

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

this.Database.Log = (delegate (string s){ System.Diagnostics.Debug.WriteLine(s); }); 

Который в свою очередь, является короткий руку (как уже другие ответы) создание частной метод и назначение ссылки делегата на этот частный метод:

this.Database.Log = (Action<string>)__compiler_generated_function__; 

private void __compiler_generated_function__(string s) { 
    System.Diagnostics.Debug.WriteLine(s); 
} 
3
this.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); 

В основном означает:

this.Database.Log = blah; 
void blah(string s) 
{ 
    System.Diagnostics.Debug.WriteLine(s); 
} 

Database.Log относится к типу Action<T>, который является типом делегата

See the property on MSDN

See Action<T> on MSDN

See delegates on MSDN

See lamdas on MSDN

Так что, когда this.Database хочет войти вещи, то позовет его свойство "Log", которая является Action<string>. Так как это Action<string> (и, что более важно, Action<T> - это тип делегата), вы можете назначить либо метод, который не возвращает значения, и имеет один параметр (который является строкой), либо lamda с одним параметром (также, строка) (и нет возвращаемого значения).

+0

Так что в большинстве мест, которые я сказал «Действие», я имел в виду «Действие ». Но, по-видимому, эти ('<' and '>') являются специальными символами форматирования или чем-то еще. – RoyalPotato

+3

'<' and '>' используются для создания тегов HTML в синтаксисе уценки (например, ' foo').Либо оберните их как встроенный код с обратными тиками ('\' <\ ''), либо избегайте их с помощью косой черты ('\ <') или как объекты HTML ('<') –

1

Это означает назначение функции this.Database.Log. Когда this.Database.Log выполняет это находит функцию

s => System.Diagnostics.Debug.WriteLine(s); 

, обозначающее

void LogMethod(string s) 
{ 
    System.Diagnostics.Debug.WriteLine(s); 
} 
Смежные вопросы