[英]What does this C# code with an “arrow” mean and how is it called?
我試圖在我的 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<int, int, int> adder = (m, n) => m + n;
在這里,我定義了一個方法,它吃掉一對int
並返回一個int
。 該int
是通過添加輸入參數的值獲得的。 它可以像任何其他方法一樣被調用。
int four = adder(2, 2);
這是 MSDN 上關於lambda 表達式的文章和關於lambda 運算符的文章。 如果你真的感興趣,這個名字來自lambda calculus 。
為了完整性(對於搜索結果等):在更新的 C# 版本(自 6.0 起)中, =>
語法已從僅用於委托和表達式樹的 lambda 擴展到涵蓋表達式主體成員。 這意味着一系列簡單的成員,如屬性、方法等 - 可以實現為表達式主體; 例如:
public int Foo { get { return innerObj.SomeProp; } }
public void Bar() { Write("Thing"); }
可以寫成:
public int Foo => innerObj.SomeProp;
public void Bar() => Write("Thing");
它被稱為lambda 表達式。
http://msdn.microsoft.com/en-us/library/bb311046.aspx - lambda 運算符。
(blah,blah,blah)=>{return true;}
是一個 lambda 表達式。 它看起來不像您習慣的 lambda,因為它不使用任何傳遞給它的參數。 編譯器會將這個 lambda 轉換為您的委托函數,而您無需經歷創建一個完整函數的漫長而煩人的過程,該函數實現了 ServicePointManager.ServerCertificateValidationCallback 使用的委托規范。
=>
-Operator表示一個 lambda 表達式。
但是對於現在訪問這個問題的人來說,另一個用例可能是箭頭作為屬性 getter 的簡寫。 這個特性是在 C# 6 中引入的。所以而不是編寫
public string Foo
{
get
{
return this.bar;
}
}
您可以使用以下代碼段:
public string Foo
{
get => this.bar;
}
甚至更短:
public string Foo => this.bar;
傑森很好地解釋了這一點。 這是一個使用不同技術偵聽事件的示例:
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());
}
}
}
此代碼段稱為匿名函數。 它圍繞回調委托構建了一個匿名方法,並且始終返回 true。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.