Что означает этот код С# со "стрелкой" и как он называется?
Я пытался включить SSL в своей клиентской программе на С# и нашел следующий код в этом ответе:
System.Net.ServicePointManager.ServerCertificateValidationCallback +=
(se, cert, chain, sslerror) =>
{
return true;
};
Я добавил код в свою программу, и он решил проблему, но я полностью не понимаю, как именно это работает.
Левая часть System.Net.ServicePointManager.ServerCertificateValidationCallback
- это некоторая обратная связь, а +=
изменяет этот обратный вызов. Но что означает остальная конструкция? Я потратил 20 минут на поиски, по крайней мере, на том, как это правильно называется, и где я могу найти больше информации о том, как читать это, но все напрасно. Я полагаю, что это как-то связано с LINQ и искал "LINQ arrow", но не нашел ничего разумного.
Как называется конструкция (blah,blah,blah)=>{return true;}
и где я могу найти дополнительную информацию о таких конструкциях?
Ответы
Ответ 1
Это лямбда-выражение. Это особый анонимный делегат. В основном вы определяете метод и не указываете имя. Его параметры находятся слева от =>
, а тело метода находится справа от =>
. В вашем конкретном случае
(se, cert, chain, sslerror) => { return true; };
- анонимный метод, определяемый выражением лямбда. Этот конкретный метод имеет четыре параметра
object se
X509Certificate cert
X509Chain chain
SslPolicyErrors sslerror
и тело метода
return true;
Как будто вы сказали
class ServerCertificateValidation {
public bool OnRemoteCertificateValidation(
object se,
X509Certificate cert,
X509Chain chain,
SslPolicyErrors sslerror
) {
return true;
}
}
а затем
var validation = new ServerCertificateValidation();
System.Net.ServicePointManager.ServerCertificateValidationCallback +=
validation.OnRemoteCertificateValidation;
Как называется конструкция (blah,blah,blah)=>{return true;}
и где я могу найти дополнительную информацию о таких конструкциях?
Он называется так же, как вызывается любой другой метод. Например, вы можете сделать это:
Func<int, int, int> adder = (m, n) => m + n;
Здесь я определяю метод, который ест пару int
и возвращает int
. Это int
получается путем добавления значений входных параметров. Он может быть вызван, как и любой другой метод.
int four = adder(2, 2);
Здесь статья о MSDN на лямбда-выражениях и статья о лямбда-оператора. Если вы действительно заинтересованы, имя происходит от лямбда-исчисления.
Ответ 2
Он назывался лямбда-выражением.
http://msdn.microsoft.com/en-us/library/bb311046.aspx - Оператор лямбда.
Ответ 3
Для полноты (для результатов поиска и т.д.): В более поздних версиях С# (начиная с версии 6.0) синтаксис =>
был расширен только от lambdas для делегатов и деревьев выражений, чтобы охватить элементы с выраженным выражением. Это означает, что ряд простых элементов, таких как свойства, методы и т.д., Могут быть реализованы как тела выражений; например:
public int Foo { get { return innerObj.SomeProp; } }
public void Bar() { Write("Thing"); }
может быть написано:
public int Foo => innerObj.SomeProp;
public void Bar() => Write("Thing");
Ответ 4
(blah,blah,blah)=>{return true;}
- это лямбда-выражение. Это не похоже на lambdas, к которому вы привыкли, потому что не использует никаких аргументов, которые ему передают. Компилятор превратит эту лямбду в функцию делегата для вас, без необходимости проходить длинный, раздражающий процесс создания целой функции, которая реализует спецификацию делегата, которую использует ServicePointManager.ServerCertificateValidationCallback.
Ответ 5
Джейсон объясняет это очень хорошо. Вот пример использования события, которое прослушивается с использованием разных методов:
using System;
namespace Events
{
class Program
{
static void Main(string[] args)
{
Events e = new Events();
e.FireEvents();
Console.ReadLine();
}
}
public class Events
{
private event EventHandler<EventArgs> EventTest;
public Events()
{
EventTest += new EventHandler<EventArgs>(function);
EventTest += delegate
{
Console.WriteLine("written by an anonymous method.");
};
EventTest += (o, e) =>
{
Console.WriteLine("written by a lambda expression");
};
}
private void function(object sender, EventArgs e)
{
Console.WriteLine("written by a function.");
}
public void FireEvents()
{
if (EventTest != null)
EventTest(this, new EventArgs());
}
}
}
Ответ 6
Этот фрагмент называется анонимной функцией. Он создает анонимный метод вокруг делегата callback и всегда возвращает true.
Ответ 7
The =>
-Operator представляет собой лямбда-выражение.
Но для тех из вас, кто посещает этот вопрос в настоящее время, другой случай использования может быть стрелкой, как сокращением для имущества. Эта функция появилась на С# 6. Поэтому вместо написания
public string Foo
{
get
{
return this.bar;
}
}
вы можете использовать следующий фрагмент:
public string Foo
{
get => this.bar;
}
или даже короче:
public string Foo => this.bar;