我在 Xamarin.Android 中實作了 DatePickerFragment 并遵循了官方檔案。并注意到一些奇怪的事情。
處理程式是這樣宣告的
Action<DateTime> _dateSelectedHandler = delegate { };
主要通過 Linq 和執行緒使用 lambda 運算式。根據我的經驗,我想將其更改為 lambda bc,它們是相同的。即使我將滑鼠懸停在委托上,工具提示也會顯示“Lambda 運算式”。
所以我嘗試了這個:
Action<DateTime> _dateSelectedHandler = () => { };
我在這里得到的錯誤是委托操作不采用 0 引數。但是在我的第一個示例中捕獲了哪些論點?認為這是因為 Action 類所以我這樣做了:
Action<DateTime> _dateSelectedHandler = (aux) => { };
在這種情況下aux是可以的型別DateTime。但是,我仍然很困惑。我查閱了同事推薦的一本書。C# 8.0 簡介 J. Albahari 和 E. Johannsen 的權威參考。在那里我發現委托是一個呼叫方法的物件,而 lambda 運算式是代替委托實體撰寫的方法。根據這個定義,為什么我們作為開發人員會使用委托?委托只是一個帶有額外步驟的 lambda。
uj5u.com熱心網友回復:
(aux) => { };是一個 lambda 陳述句。請注意,aux還沒有型別。Action<DateTime>另一方面是委托,并且具有特定的型別。lambda 陳述句中的引數型別是從分配給它的委托的型別推斷出來的。因此 lambda 陳述句可以被視為代表之上的語法糖。
就我個人而言,我傾向于使用內置的Func<> / Action<>委托而不是創建自定義委托。我傾向于通過分配一個 lambda 函式而不是顯式創建它們來創建委托,并讓編譯器做它的事情來推斷型別。
但這并不意味著不使用委托來使整個系統作業,您需要使用delegate關鍵字的情況很少見。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/497396.html
下一篇:XamarinAndroid:無法從“AndroidX.Fragment.App.FragmentManager”轉換為“Android.Support.V4.App.FragmentManager”
