怎麼從菜鳥程式員變成架構師 一、正確理解架構師的工作 架構師一般是不會去探討業務的範疇,他是把整個項目的結構搭出來,並讓程式員去填肉(業務功能部分) ,一般架構師的好壞決定這個項目的工期與質量,現在市面上看見的架構師一般都是別人的框架直接拿來用的,所以就不存在技術提升的範疇。很少會自己搭建框架。如果 ...
C# 10 包括了對 Lambda 表達式的處理方式的許多改進:
- Lambda 表達式可以具有自然類型,這使編譯器可從 Lambda 表達式或方法組推斷委托類型。
- 如果編譯器無法推斷返回類型,Lambda 表達式可以聲明該類型。
- 屬性可應用於 Lambda 表達式。
這些功能使 Lambda 表達式更類似於方法和本地函數。 在不聲明委托類型的變數的情況下,這些改進使得人們可以更容易使用 Lambda 表達式,並且它們可以與新的 ASP.NET Core 最小 API 更無縫地工作。
首先要介紹的是自動推斷委派類型(inferred delegate type)。示例:
Func<string> hello = () => "Hello World";
Console.WriteLine(hello());
此示例在C# 9可以通過編譯。到了C# 10,則因為編譯器能夠自動推斷委派類型而可以使用var
定義委派。
var hello = () => "Hello World"; // C# 9 無法編譯!
但如果委派的回傳值為null,編譯器則無法判定你想回傳什麼類型,例如:
var hello = () => null; // 無法編譯!
此時如果還是想用var來聲明返回類型,則可以在撰寫lambda表達式的時候定義返回類型
var hello = string? () => null; // OK!
當你的程式有很複雜的嵌套lambda語句,便可使用這種明確聲明返回類型的方式來減輕編譯器推斷類型的負擔,從而加快編譯速度。這是lambda語法的第二項改進。
第三項改進是當我們把lambda表達式傳入某方法的參數時,參數類型可以是object
、Delegate
、Expression
M1(() => "test"); // Func<string>
M2(() => "test"); // Func<string>
M3(() => "test"); // Expression<Func<string>>
void M1(object x) { }
void M2(Delegate x) { }
void M3(Expression x) { }
在C# 9中,第1行至第3行都無法通過編譯(無法將lambda表達式轉換成目標參數類型),C# 10則沒有問題。
最後一項改進是,lambda表達式從現在開始可以套用特征項(attribute),包括匿名方法、方法參數、以及返回值,皆可套用。示例:
var fn1 = [Description("Hello")] () => "Hello";
var fn2 = ([Description("參數") string s) => "Hello " + s;
var fn3 = [Description("Hello")]
[return: Description("返回字元串")]
([Description("參數")] string s) => "Hello " + s;
說明:
- 為
fn1
的匿名方法應用DescriptionAttribute修飾符,也就是給方法加上說明文字。 - 為
fn2
的匿名方法加上參數的說明文字。 - 為
fn3
的匿名方法、參數、返回類型都加上說明文字。
使用時機:某些API會去判斷傳入的委托方法是否應用了某些特性而有不同的行為,此時便可使用C# 10新增的lambda特性語法來撰寫匿名方法,而不用像以前那樣非得撰寫具名方法不可。
作者:gmval
出處:https://www.cnblogs.com/gmval/p/17071237.html
本文版權歸作者和博客園共有,寫文不易,支持原創,歡迎轉載【點贊】,轉載請保留此段聲明,且在文章頁面明顯位置給出原文連接,謝謝。
關註個人公眾號,定時同步更新優秀資源及技術文章