具有“箭头”的C#代码是什么意思,它是如何调用的?

时间:2011-01-28 14:03:53

标签: c# .net linq

我试图在我的C#客户端程序中启用SSL,并找到以下代码in this answer

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

我将代码添加到我的程序中它解决了问题,但我完全不知道它是如何工作的。

左侧部分System.Net.ServicePointManager.ServerCertificateValidationCallback是一些回调,+=修改了该回调。但剩下的构造意味着什么呢?我花了20分钟搜索至少找到它是如何正确调用的,在哪里我可以找到更多关于如何阅读的信息,但都是徒劳的。我想它与LINQ有某种关联并搜索“LINQ箭头”,但没有找到任何合理的。

如何调用(blah,blah,blah)=>{return true;}构造,在哪里可以找到有关此类构造的更多信息?

7 个答案:

答案 0 :(得分:69)

这是一个lambda表达式。这是一个非常特殊的匿名代表。基本上你是在定义一个方法而不是给出一个名字。它的参数位于=>的左侧,方法体位于=>的右侧。在您的特定情况下,

(se, cert, chain, sslerror) => { return true; };

是由lambda表达式定义的匿名方法。这种特殊方法有四个参数

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); 

以下是lambda expressions上关于MSDN的文章和lambda operator上的文章。如果您真的感兴趣,名称来自lambda calculus

答案 1 :(得分:6)

答案 2 :(得分:4)

为了完整性(用于搜索结果等):在C#的最新版本(自6.0起)中,=>语法已从代表和表达式树的lambda扩展到expression-bodied members 。这意味着可以将一系列简单成员(例如属性,方法等)实现为表达式主体;例如:

public int Foo { get { return innerObj.SomeProp; } }
public void Bar() { Write("Thing"); }

可以这样写:

public int Foo => innerObj.SomeProp;
public void Bar() => Write("Thing");

答案 3 :(得分:3)

(blah,blah,blah)=>{return true;} 

是lambda表达式。它看起来不像你习惯的lambda,因为它不使用传递给它的任何参数。编译器会将此lambda转换为委托函数,而无需经历漫长而烦人的创建实现ServicePointManager.ServerCertificateValidationCallback使用的委托规范的函数的过程。

答案 4 :(得分:2)

杰森解释得非常好。以下是使用不同技术收听事件的示例:

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()); 
        }
    }
}

答案 5 :(得分:1)

此代码段称为匿名函数。它围绕回调委托构建一个匿名方法,并且allways返回true。

答案 6 :(得分:0)

=>-Operator代表一个lambda表达式。

但是对于那些今天访问这个问题的人来说,另一个用例可能是箭头,它是获取属性的简写形式。此功能是C#6中引入的。因此,无需编写

public string Foo
{
    get
    {
        return this.bar;
    }
}

您可以使用以下代码段:

public string Foo 
{
    get => this.bar;
}

或更短:

public string Foo => this.bar;