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

歡迎訪問 生活随笔!

生活随笔

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

C#

C# 5.0新加特性

發布時間:2023/12/2 C# 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 5.0新加特性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 異步編程

在.Net 4.5中,通過async和await兩個關鍵字,引入了一種新的基于任務的異步編程模型(TAP)。在這種方式下,可以通過類似同步方式編寫異步代碼,極大簡化了異步編程模型。如下式一個簡單的實例:

????static?async?void?DownloadStringAsync2(Uri?uri)
????{
????????var?webClient =?new?WebClient();
????????var?result =?await?webClient.DownloadStringTaskAsync(uri);
????????Console.WriteLine(result);
????}

而之前的方式是這樣的:

????static?void?DownloadStringAsync(Uri?uri)
????{
????????var?webClient =?new?WebClient();
????????webClient.DownloadStringCompleted += (s, e) =>
????????????{
????????????????Console.WriteLine(e.Result);
????????????};
????????webClient.DownloadStringAsync(uri);
????}

也許前面這個例子不足以體現async和await帶來的優越性,下面這個例子就明顯多了:

????public?void?CopyToAsyncTheHardWay(Stream?source,?Stream?destination)
????{
????????byte[] buffer =?new?byte[0x1000];
????????Action<IAsyncResult> readWriteLoop =?null;
????????readWriteLoop = iar =>
????????{
????????????for?(bool?isRead = (iar ==?null); ; isRead = !isRead)
????????????{
????????????????switch?(isRead)
????????????????{
????????????????????case?true:
????????????????????????iar = source.BeginRead(buffer, 0, buffer.Length,
????????????????????????????readResult =>
????????????????????????????{
????????????????????????????????if?(readResult.CompletedSynchronously)?return;
????????????????????????????????readWriteLoop(readResult);
????????????????????????????},?null);
????????????????????????if?(!iar.CompletedSynchronously)?return;
????????????????????????break;
????????????????????case?false:
????????????????????????int?numRead = source.EndRead(iar);
????????????????????????if?(numRead == 0)
????????????????????????{
????????????????????????????return;
????????????????????????}
????????????????????????iar = destination.BeginWrite(buffer, 0, numRead,
????????????????????????????writeResult =>
????????????????????????????{
????????????????????????????????if?(writeResult.CompletedSynchronously)?return;
????????????????????????????????destination.EndWrite(writeResult);
????????????????????????????????readWriteLoop(null);
????????????????????????????},?null);
????????????????????????if?(!iar.CompletedSynchronously)?return;
????????????????????????destination.EndWrite(iar);
????????????????????????break;
????????????????}
????????????}
????????};
????????readWriteLoop(null);
????}

????public?async?Task?CopyToAsync(Stream?source,?Stream?destination)
????{
????????byte[] buffer =?new?byte[0x1000];
????????int?numRead;
????????while?((numRead =?await?source.ReadAsync(buffer, 0, buffer.Length)) != 0)
????????{
????????????await?destination.WriteAsync(buffer, 0, numRead);
????????}
????}

關于基于任務的異步編程模型需要介紹的地方還比較多,不是一兩句能說完的,有空的話后面再專門寫篇文章來詳細介紹下。另外也可參看微軟的官方網站:Visual Studio Asynchronous Programming,其官方文檔Task-Based Asynchronous Pattern Overview介紹的非常詳細, VisualStudio中自帶的CSharp Language Specification中也有一些說明。

2. 調用方信息

很多時候,我們需要在運行過程中記錄一些調測的日志信息,如下所示:

????public?void?DoProcessing()
????{
????????TraceMessage("Something happened.");
????}

為了調測方便,除了事件信息外,我們往往還需要知道發生該事件的代碼位置以及調用棧信息。在C++中,我們可以通過定義一個宏,然后再宏中通過__FILE__和__LINE__來獲取當前代碼的位置,但C#并不支持宏,往往只能通過StackTrace來實現這一功能,但StackTrace卻有不是很靠譜,常常獲取不了我們所要的結果。

針對這個問題,在.Net 4.5中引入了三個Attribute:CallerMemberName、CallerFilePath和CallerLineNumber。在編譯器的配合下,分別可以獲取到調用函數(準確講應該是成員)名稱,調用文件及調用行號。上面的TraceMessage函數可以實現如下:

????public?void?TraceMessage(string?message,
????????????[CallerMemberName]?string?memberName =?"",
????????????[CallerFilePath]?string?sourceFilePath =?"",
????????????[CallerLineNumber]?int?sourceLineNumber = 0)
????{
????????Trace.WriteLine("message: "?+ message);
????????Trace.WriteLine("member name: "?+ memberName);
????????Trace.WriteLine("source file path: "?+ sourceFilePath);
????????Trace.WriteLine("source line number: "?+ sourceLineNumber);
????}

另外,在構造函數,析構函數、屬性等特殊的地方調用CallerMemberName屬性所標記的函數時,獲取的值有所不同,其取值如下表所示:

調用的地方

CallerMemberName獲取的結果

方法、屬性或事件

方法,屬性或事件的名稱

構造函數

字符串 ".ctor"

靜態構造函數

字符串 ".cctor"

析構函數

該字符串 "Finalize"

用戶定義的運算符或轉換

生成的名稱成員,例如, "op_Addition"。

特性構造函數

特性所應用的成員的名稱

例如,對于在屬性中調用CallerMemberName所標記的函數即可獲取屬性名稱,通過這種方式可以簡化?INotifyPropertyChanged?接口的實現。

轉載于:https://www.cnblogs.com/kylin2016/p/5817088.html

總結

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

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