[英]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.