當前位置:
首頁 > 知識 > C 7.0 新特性:本地方法

C 7.0 新特性:本地方法


C# 7.0:本地方法

VS 2017 的 C# 7.0 中引入了本地方法,本地方法是一種語法糖,允許我們在方法內定義本地方法。更加類似於函數式語言,但是,本質上還是基於面向對象實現的。

C 7.0 新特性:本地方法

1. 本地方法

先看一個示例:

C 7.0 新特性:本地方法

在此示例中,在 Main 方法內,嵌套定義了兩個方法:Add 和 Multiply。這個方法可以在 Main 方法內被使用。這種方法被稱為本地方法。英文稱為:Local function.

使用 ILDasm 工具,可以看到編譯之後的結果。

C 7.0 新特性:本地方法

這兩個本地方法被翻譯成了兩個靜態的私有方法,它只能在定義的方法內被調用。

本地方法的語法定義為:

<modifiers: async | unsafe> <return-type> <method-name> <parameter-list>

方法的修飾符只有兩種:async 和 unsafe,所有的本地方法都是私有的

  • 如果您使用了 private 修飾,會收到 編譯器的錯誤提示:error CS0106, "The modifier "static" is not valid for this item."

  • 如果您使用了 static,會收到編譯器的錯誤提示:error CS0106, "The modifier "static" is not valid for this item."

2. 帶有返回類型的本地方法

本地方法也可以帶有返回類型。如果類型用錯的話,Visual Studio 可以給出提示。

C 7.0 新特性:本地方法

C 7.0 新特性:本地方法

3. 使用本地方法實現遞歸

本地方法不需要維護調用堆棧,而遞歸方法需要維護調用堆棧,本地方法效率更高。下面的示例演示了兩種方法的區別。

注意:該示例使用了類型 BigInteger ,需要添加對程序集 System.Numeric.dll 的引用。

C 7.0 新特性:本地方法

代碼如下。

C 7.0 新特性:本地方法

C 7.0 新特性:本地方法

在我的機器上,結果如下:

Using local function: 181770

Using recursive function: 456602

可以看到兩者之間的性能差異。

此時,為了傳遞 result ,在生成的代碼中,編譯器會自動做一些額外的工作。

C 7.0 新特性:本地方法

4. 本地方法與 Lambda 的比較

1. 性能

當創建 Lambda 的時候,將會創建一個委託,這需要內存分配,因為委託是一個對象。而本地方法則不需要,它是一個真正的方法。

另外,本地方法可以更為有效地使用本地變數,Lambda 將變數放到類中,而本地方法可以使用結構,而不使用內存分配。

這意味著調用本地方法更為節約且可能內聯。

2. 本地方法可以遞歸

Lambda 也可以實現遞歸,但是代碼醜陋,您需要先賦予 lambda 為 null。本地方法可以更為自然地遞歸。

3. 本地方法可以使用泛型

Lambda 不能使用泛型。這是因為需要賦予一個實例類型的變數。

4. 本地方法可以實現迭代器

Lambda 不能使用 yield return (以及 yield break)關鍵字,以實現 IEnumerable<T> 返回函數。本地方法可以。

5. 本地方法更為易讀

5. 其它資源:

  • 官方的 本地方法 說明

  • 本地方法與 Lambda 表達式

  • C# 7.0 新特性2: 本地方法

  • Thoughts on C# 7 Local Functions

文章來自博客園

找工作難?那是你沒選對行業!

2017年【中公教育】特別推出2017年就業促進計劃,500萬就業基金助你成為IT達人

詳情請戳://www.ujiuye.com/zt/jycj/?wt.bd=zy35844tt

什麼?海量IT學習資料白給你都不要?別想了,加群搶:499754614

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 IT優就業 的精彩文章:

httpd網頁身份認證
CSS常見布局方式
python郵件SMTP的GUI編程
web端 css hack
css|浮動和清除浮動

TAG:IT優就業 |