簡體   English   中英

這段帶有“箭頭”的 C# 代碼是什么意思,它是如何調用的?

[英]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");
(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM