Что символ "=>" делает после моего метода в этом коде C #? - PullRequest
5 голосов
/ 29 октября 2009

Я недавно задал вопрос здесь, и кто-то дал такой ответ:

private void button1_Click(object sender, EventArgs e)
{
     var client = new WebClient();
     Uri X = new Uri("http://www.google.com");

     client.DownloadStringCompleted += (s, args) => //THIS, WHAT IS IT DOING?
     {
         if (args.Error == null && !args.Cancelled)
         {
             MessageBox.Show();
         }
     };

     client.DownloadStringAsync(X);
}

Что это => делает? Я впервые это вижу.

Ответы [ 3 ]

19 голосов
/ 29 октября 2009

Это лямбда-оператор. Вы определяете анонимную функцию, которая принимает два аргумента (s, args) (спецификаторы типа опущены), а тело указанной функции - это то, что появляется после символа =>.

Концептуально это так же:

...
client.DownloadStringCompleted += Foo;
}

void Foo(object sender, EventArgs args)
{
    if (args.Error == null && !args.Cancelled)
    {
        MessageBox.Show();
    }
};
10 голосов
/ 29 октября 2009

В основном это говорит: «Я даю вам это (s,b)», и вы возвращаете мне s*b или что-то еще, и если вы используете лямбду с выражениями, но это может быть что-то вроде этого: я даю вам это (s,b) и сделайте что-нибудь с ними в блоке операторов, например:

{
  int k = a+b;
  k = Math.Blah(k);
  return k;
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~

Выражение Lambda - это неназванный метод, написанный вместо экземпляра делегата. Компилятор немедленно преобразует лямбда-выражение либо в:

  • Экземпляр делегата
  • Дерево выражений

delegate int Transformer(int i);

class Test{
  static void Main(){
     Transformer square = x => x*x;
     Console.WriteLine(square(3));
  } 

}

Мы могли бы переписать это так:

delegate int Transformer(int i);

class Test{
  static void Main(){
     Transformer square = Square;
     Console.WriteLine(square(3));
  } 
  static int Square (int x) {return x*x;}
}

Лямбда-выражение имеет следующий вид:

(parameters) => expression or statement-block

В предыдущем примере был один параметр x, а выражение x*x

в нашем примере x соответствует параметру i, а выражение x*x соответствует типу возвращаемого значения int, поэтому совместимо с делегатом Transformer;

delegate int Transformer ( int i);

Код лямбда-выражения может быть блоком выражения вместо выражения. Мы можем переписать наш пример следующим образом:

x => {return x*x;}

Дерево выражений типа Expression<T>, представляющее код внутри выражения lamda в модели с возможностью прохождения объекта. Это позволяет использовать лямбда-выражение позже во время выполнения (пожалуйста, проверьте «выражение запроса» для LINQ)

6 голосов
/ 29 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...