我试图在我的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;}
构造,在哪里可以找到有关此类构造的更多信息?
答案 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)
它被称为lambda expression。
http://msdn.microsoft.com/en-us/library/bb311046.aspx - lambda运算符。
答案 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;