簡體   English   中英

C# 需要幫助理解奇怪的 Lambda 構造

[英]C# Need help understanding strange Lambda construct

今天在ac#項目中遇到了這段代碼:

public partial class LoginView : UserControl
    {
        public LoginView()
        {
            this.InitializeComponent();
            this.Loaded += (s, e) => this.user.Focus();
        }
     ...
    }

this.Loaded 被聲明

public delegate void RoutedEventHandler(object sender, RoutedEventArgs e);

好的,所以我們可以添加一個帶有兩個參數的事件處理程序代碼,一個 object 類型的 sender s 和一個 RoutedEventArgs e。 實際分配的是

public bool Focus ();

在我看來,它是一個不帶參數並返回一個布爾值的函數。

該代碼顯然有效,我想我明白它的作用(如果 this.loaded 觸發,則聚焦名為“user”的文本框)但為什么這段代碼有效?

謝謝,

阿明。

您沒有將Focus方法分配給Loaded委托。 代碼實際上在做什么,是將一個 lambda 分配給符合委托定義的委托。

編碼

 this.Loaded += (s, e) => this.user.Focus();

實際上是一個簡寫:

 this.Loaded += new RoutedEventHandler(FocusSomething);

並且上面代碼片段中的FocusSomething方法將被聲明為

public void FocusSomething(object sender, RoutedEventArgs args)
{
    this.user.Focus();
}

您只是“忽略”了Focus方法的返回值,但分配給委托的方法具有 void 返回類型並接受 2 個參數(object 和 RoutedEventArgs,因此這只是有效的)。

因此.Loaded事件確實提供了兩個參數,但不需要在您的 lambda 中使用它們。 根據您的代碼的格式,它們可以被安全地忽略。 同樣,雖然Focus()方法確實返回一個值,但不需要在任何地方使用它。 這不是很有防御性,並且實施者提供價值的可能性是有原因的,但嚴格來說,從語言的角度來看,這不是必需的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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