Что означает этот код (s, e)? - PullRequest
       13

Что означает этот код (s, e)?

8 голосов
/ 01 сентября 2011

Как работает этот код?

      app.InstallStateChanged += (s, e) => UpdateUI();
      NetworkChange.NetworkAddressChanged +=
            (s, e) => UpdateNetworkIndicator();

Может кто-нибудь, пожалуйста, расшифруйте это?

Код взят из примера, используемого в системах Silverlight 4 OOB http://msdn.microsoft.com/en-us/library/dd833066(v=VS.95).aspx

UpdateNetworkIndicator ничего не возвращает. UpdateUI ничего не возвращает.

Ответы [ 7 ]

9 голосов
/ 01 сентября 2011

Это лямбда-выражение , которое содержит несколько параметров.В этом случае (так как вы используете функцию для замены обработчика событий) они эквивалентны параметрам object и EventArgs.

Ваш код эквивалентен приведенному ниже

app.InstallStateChanged += OnInstallStateChanged;
NetworkChange.NetworkAddressChanged += OnNetworkAddressChanged;

/* ... */

private void OnInstallStateChanged(object s, EventArgs e)
{
    UpdateUI();
}

private void OnNetworkAddressChanged(object s, EventArgs e)
{
    UpdateNetworkIndicator();
}
9 голосов
/ 01 сентября 2011

Это лямбда-выражение.

"Все лямбда-выражения используют лямбда-оператор =>, который читается как "идет к". Левая сторона лямбда-оператора определяет ввод параметры (если есть) и правая часть содержит выражение или Блок выписок. Лямбда-выражение x => x * x читается "х идет к х раз х. "

http://msdn.microsoft.com/en-us/library/bb397687.aspx

6 голосов
/ 01 сентября 2011

Оба метода UpdateUI () и UpdateNetworkIndicator () являются пользовательскими методами обработки событий.

Оператор + = присоединяет эти обработчики событий к событиям, инициируемым приложением и NetworkChange, соответственно.* => Обозначает лямбда-выражение.(S, e) являются входными параметрами (в данном случае стандартным отправителем, аргументами событий ), а справа от => является оператор или выражение.

В этом случае выможет переписать это как:

app.InstallStateChanged += UpdateUI;
NetworkChange.NetworkAddressChanged += UpdateNetworkIndicator;

, и это должно работать так же хорошо.

2 голосов
/ 01 сентября 2011

Рассмотрим этот пример

Button1.Click += (s, e) => log(e);

- это короткая рука (с использованием лямбда-выражения) для

Button1.Click += new EventHandler(Button1_Click);

и

void Button1_Click(object sender, EventArgs e)
{
    log(e);
}
1 голос
/ 01 сентября 2011

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

Таким образом, в гипотетическом контексте

S представляет собой строку E представляет собой int

(s, e) =>

Означает, что дальнейшие ссылки вФункция ссылается на эти соответствующие типы объектов по именам s и e.

(s, e) => s.Length + e

Средства: получить значение экземпляра строкик которому относится s и добавляет к нему значение экземпляра типа int, к которому относится e.

1 голос
/ 01 сентября 2011

Этот синтаксис называется Лямбда-выражение . От MSDN,

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

И (s, e) объявляют входные параметры созданного делегата или дерева выражений. Когда есть один входной параметр, скобки не нужны, и вы можете написать просто s => .... При наличии нескольких параметров обязательны скобки - (s, e) =>.

1 голос
/ 01 сентября 2011

InstallStateChanged и NetworkAddressChanged являются событиями; вы видите лямбда-синтаксис, определяющий обработчик событий для вызова UpdateUI или UpdateNetworkIndicator, если соответствующие события запускаются.

...