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

我试图在我的C#客户端程序中启用SSL,并在此答案中找到以下代码:

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

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

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

怎么会(blah,blah,blah)=>{return true;}构造被调用,哪里可以找到关于这种结构的更多信息?

这是一个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 adder = (m, n) => m + n; 

这里我定义了一个方法,它吃一对int并返回一个int 。 通过添加输入参数的值来获得该int 。 它可以像任何其他方法一样调用。

 int four = adder(2, 2); 

这是关于lambda表达式的 MSDN上的一篇文章和关于lambda运算符的文章。 如果您真的感兴趣,这个名字来自lambda演算 。

它被称为lambda表达式 。

http://msdn.microsoft.com/en-us/library/bb311046.aspx – lambda运算符。

为了完整性(对于搜索结果等):在更新版本的C#(从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"); 
 (blah,blah,blah)=>{return true;} 

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

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

 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 EventTest; public Events() { EventTest += new EventHandler(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()); } } } 

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

=> -Operator表示lambda表达式。

但对于那些现在访问这个问题的人来说,另一个用例可能是箭头作为财产获取者的简写。 这个特性在C#6中引入。所以不要写

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

您可以使用以下代码段:

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

甚至更短:

 public string Foo => this.bar;