Подтвердить что ты не робот

Что означает этот код С# со "стрелкой" и как он называется?

Я пытался включить SSL в своей клиентской программе на С# и нашел следующий код в этом ответе:

System.Net.ServicePointManager.ServerCertificateValidationCallback +=
    (se, cert, chain, sslerror) =>
    {
        return true;
    };

Я добавил код в свою программу, и он решил проблему, но я полностью не понимаю, как именно это работает.

Левая часть System.Net.ServicePointManager.ServerCertificateValidationCallback - это некоторая обратная связь, а += изменяет этот обратный вызов. Но что означает остальная конструкция? Я потратил 20 минут на поиски, по крайней мере, на том, как это правильно называется, и где я могу найти больше информации о том, как читать это, но все напрасно. Я полагаю, что это как-то связано с LINQ и искал "LINQ arrow", но не нашел ничего разумного.

Как называется конструкция (blah,blah,blah)=>{return true;} и где я могу найти дополнительную информацию о таких конструкциях?

4b9b3361

Ответ 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 на лямбда-выражениях и статья о лямбда-оператора. Если вы действительно заинтересованы, имя происходит от лямбда-исчисления.

Ответ 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;