日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# 7.0 新特性:本地方法

發布時間:2024/4/17 C# 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 7.0 新特性:本地方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C# 7.0:本地方法

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

1. 本地方法

先看一個示例:

1 using static System.Console; 2 3 namespace UseLocalFunctions 4 { 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 void Add(int x, int y) 10 { 11 WriteLine($"Sum of {x} and {y}: is {x + y}"); 12 } 13 14 void Multiply(int x, int y) 15 { 16 WriteLine($"Multiply of {x} and {y} is: {x * y}"); 17 Add(30, 10); 18 } 19 20 Add(10, 30); 21 Multiply(40, 30); 22 23 ReadLine(); 24 } 25 } 26 }

?

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

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

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

本地方法的語法定義為:

<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 可以給出提示。

1 class Program 2 { 3 static void Main(string[] args) 4 { 5 PrintStudentMarks(101, 6 new Subject 7 { 8 SubjectName = "Math", 9 Marks = 96 10 }, new Subject 11 { 12 SubjectName = "physics", 13 Marks = 88 14 }, new Subject 15 { 16 SubjectName = "Chem", 17 Marks = 91 18 }); 19 20 ReadLine(); 21 } 22 23 public static void PrintStudentMarks(int studentId, params Subject[] subjects) 24 { 25 WriteLine($"Student Id{studentId} Total Marks: {CalculateMarks()}"); 26 WriteLine($"Student wise marks"); 27 foreach(var subject in subjects) 28 { 29 WriteLine($"Subject Name: {subject.SubjectName}\t Marks: {subject.Marks}"); 30 } 31 32 decimal CalculateMarks() 33 { 34 decimal totalMarks = 0; 35 foreach(var subject in subjects) 36 { 37 totalMarks += subject.Marks; 38 } 39 40 return totalMarks; 41 } 42 } 43 44 public class Subject 45 { 46 public string SubjectName 47 { 48 get; set; 49 } 50 51 public decimal Marks 52 { 53 get; set; 54 } 55 } 56 }

?

?

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

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

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

代碼如下。

1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Stopwatch watch = new Stopwatch(); 6 watch.Start(); 7 BigInteger f1 = GetFactorialUsingLocal(9000); 8 watch.Stop(); 9 WriteLine($"Using local function: {watch.ElapsedTicks}"); 10 11 watch.Reset(); 12 watch.Start(); 13 BigInteger f2 = GetFactorial(9000); 14 watch.Stop(); 15 WriteLine($"Using recursive function: {watch.ElapsedTicks}"); 16 } 17 18 private static BigInteger GetFactorialUsingLocal(int number) 19 { 20 if (number < 0) 21 throw new ArgumentException("negative number", nameof(number)); 22 else if (number == 0) 23 return 1; 24 BigInteger result = number; 25 while (number > 1) 26 { 27 Multiply(number - 1); 28 number--; 29 } 30 31 void Multiply(int x) => result *= x; 32 return result; 33 } 34 35 private static BigInteger GetFactorial(int number) 36 { 37 if (number < 0) 38 throw new ArgumentException("nagative number", nameof(number)); 39 return number == 0 ? 1 : number * GetFactorial(number - 1); 40 } 41 }

?

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

Using local function: 181770
Using recursive function: 456602

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

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

?

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

?

轉載于:https://www.cnblogs.com/haogj/p/7636915.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的C# 7.0 新特性:本地方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 自拍偷拍第1页 | 欧美综合一区二区 | 日日爽视频 | 国产福利一区在线观看 | 在线观看的网站 | 快色在线观看 | 日本电车痴汉 | 在线观看成人小视频 | 中文字幕88 | 女同性做受全过程动图 | 法国空姐在线观看完整版 | av在线不卡网 | 性欧美4khd高清极品 | 国产视频一区在线 | 亚州欧美| 在线播放不卡av | 欧美激情伊人 | 怡红院综合网 | 成人一区二 | 国产精品久久久久久久久免费 | 一级肉体全黄毛片 | 爱爱激情网 | 欧美三级日本三级 | 翔田千里88av中文字幕 | 久久精品噜噜噜成人 | 97色网 | 五月婷婷开心中文字幕 | 草草影院av | 日本做受| 日本精品国产 | 猎艳山村丰满少妇 | 日韩精品大片 | 99久久精品一区 | 欧美老熟妇喷水 | eeuss国产一区二区三区黑人 | 久久久久麻豆 | 一区二区三区四区在线免费观看 | 少妇高清精品毛片在线视频 | 饥渴放荡受np公车奶牛 | 青青草原亚洲视频 | 福利视频一二区 | 亚洲精品视频中文字幕 | 日韩黄色精品 | 99精品福利视频 | 国产成人免费视频网站 | 男女网站在线观看 | 华人永久免费视频 | 91麻豆精品国产91久久久久久久久 | 影音先锋色小姐 | 国产日本一区二区三区 | 俄罗斯乱妇| 玉女心经是什么意思 | 九九色九九 | 黄色三级视频网站 | 国产精品第2页 | 夜夜天天操| 日韩一区二区精品 | 久久精品久久99 | 伊人网伊人影院 | 久久国语 | 天天操天天碰 | 91香蕉国产在线观看 | 女人囗交吞精囗述 | 亚洲色图 一区二区 | 亚洲AV无码一区二区伊人久久 | 亚洲国产精品系列 | 国产情侣自拍一区 | 99ri在线观看 | 日本r级电影在线观看 | 国内精品久久久久久久久 | 久久久亚洲综合 | 亚洲国产精品久久久久爰色欲 | 亚洲国产成人91porn | 黄色片免费观看 | 亚洲综合一区二区三区 | 春色激情站 | 国内精久久久久久久久久人 | 国产美女福利 | 性——交——性——乱免费的 | 日日夜夜艹 | 久久久久久亚洲精品 | 日韩在线视频免费 | 亚洲精品国产熟女久久久 | 黄a毛片 | 国内视频一区二区三区 | 欧美插插视频 | 中文字幕人妻一区二区三区 | 玖玖爱精品| 亚洲精品一区二区三区新线路 | 特级毛片在线播放 | 少妇熟女一区二区三区 | 色www国产亚洲阿娇 自拍一区在线 | 91久久久国产精品 | 天天爽夜夜爽一区二区三区 | 日本美女一区二区三区 | eeuss国产一区二区三区黑人 | 欧美永久免费 | 五月天小说网 | 成人激情视频在线观看 |