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

sha*_*oth 29 .net c# linq

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

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

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

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

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

jas*_*son 71

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

(se, cert, chain, sslerror) => { return true; };
Run Code Online (Sandbox Code Playgroud)

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

object se
X509Certificate cert
X509Chain chain
SslPolicyErrors sslerror
Run Code Online (Sandbox Code Playgroud)

而方法体是

return true;
Run Code Online (Sandbox Code Playgroud)

就像你说的那样

class ServerCertificateValidation {
    public bool OnRemoteCertificateValidation(
        object se,
        X509Certificate cert,
        X509Chain chain,
        SslPolicyErrors sslerror
    ) {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后

var validation = new ServerCertificateValidation();
System.Net.ServicePointManager.ServerCertificateValidationCallback +=
    validation.OnRemoteCertificateValidation;
Run Code Online (Sandbox Code Playgroud)

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

它的调用方式与调用任何其他方法的方式相同.例如,您可以这样做:

Func<int, int, int> adder = (m, n) => m + n;
Run Code Online (Sandbox Code Playgroud)

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

int four = adder(2, 2); 
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*ell 14

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

public int Foo { get { return innerObj.SomeProp; } }
public void Bar() { Write("Thing"); }
Run Code Online (Sandbox Code Playgroud)

可以写成:

public int Foo => innerObj.SomeProp;
public void Bar() => Write("Thing");
Run Code Online (Sandbox Code Playgroud)


WoI*_*IIe 5

=>-运算符表示一个lambda表达式。

但是对于现在访问这个问题的人来说,另一个用例可能是箭头作为属性 getter 的简写。这个特性是在 C# 6 中引入的。所以而不是编写

public string Foo
{
    get
    {
        return this.bar;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用以下代码段:

public string Foo 
{
    get => this.bar;
}
Run Code Online (Sandbox Code Playgroud)

甚至更短:

public string Foo => this.bar;
Run Code Online (Sandbox Code Playgroud)