看看C# 6.0中那些語法糖都幹了些什麼(上篇)

来源:http://www.cnblogs.com/wufei999/archive/2017/02/24/6440069.html
-Advertisement-
Play Games

今天沒事,就下了個vs2015 preview,前段時間園子裡面也在熱炒這些新的語法糖,這裡我們就來看看到底都會生成些什麼樣的IL? 一:自動初始化屬性 確實這個比之前的版本簡化了一下,不過你肯定很好奇,到底編譯器給我們做了哪些東西呢? 從這張圖中可以看到,在ctor中<Name>k__backin ...


  今天沒事,就下了個vs2015 preview,前段時間園子裡面也在熱炒這些新的語法糖,這裡我們就來看看到底都會生成些什麼樣的IL?

 

一:自動初始化屬性

     確實這個比之前的版本簡化了一下,不過你肯定很好奇,到底編譯器給我們做了哪些東西呢?

1     class Student 2  { 3 public string Name { get; set; } = "ctrip"; 4 }

 

從這張圖中可以看到,在ctor中<Name>k__backingfield=“ctrip“的賦值在base::ctor之前,這就說明name是變數初始化賦值,而不屬於

構造函數賦值,那有什麼區別呢,如果base::ctor在<Name>k__backingfield=”ctrip"之前,那就是構造函數賦值了,不過我得特別要指明

一下,是源代碼級別的區別,而不是IL中的區別,因為在IL中都是構造函數賦值,不過語句順序不一樣而已,然後我把內部做的代碼複原如下:

 1     class Student  2  {  3 private string k__BackingField = "ctrip";  4  5 public string Name  6  {  7 get  8  {  9 return k__BackingField; 10  } 11 12 set 13  { 14 k__BackingField = value; 15  } 16  } 17 }

然後再看看怎麼讓base::ctor在<Name>k__backingfield="ctrip"之前。

 1     class Student  2  {  3 private string k__BackingField;  4  5 public string Name  6  {  7 get  8  {  9 return k__BackingField; 10  } 11 12 set 13  { 14 k__BackingField = value; 15  } 16  } 17 18 public Student() 19  { 20 k__BackingField = "ctrip"; 21  } 22 }

 

不好意思,一不小心就扯到了變數初始化和構造函數賦值在源代碼級別的區別。

 

二:只讀屬性初始化

  這個也是一個超級好玩的屬性,先來看看代碼:

1     class Student 2  { 3 public string Name { get; } 4 5 public Student(string name) 6  { 7 Name = name; 8  } 9 }

但是我們記得,在之前的C#版本是不能這麼寫,但現在惹不住好奇心,先去底層看看到底生成了什麼。

 

 

然後我就奇怪了,屬性本來就可以是只讀的,現在編譯器已經放開了,那是不是有問題了,我如果真的是需要一個只讀屬性,這個該如何是好

呢?然後我就試著在Name屬性中返回一個值,果然編譯器不放行,這就說明編譯器在裡面還做了一個貌似合理的判斷。

 

三:Lambda充當函數體

  這個聽起來就有點怪怪的,還是先看個例子。

1     class Student 2  { 3 public string Name => "ctrip"; 4 5 public void Print(string name) => Console.WriteLine(name); 6 }

不過當我看到這種寫法時,我也是醉了,假如你一年都沒有接觸C#,再回來看時,我想你肯定看不懂這些雞巴代碼了。。。沒辦法,還得繼續

看看IL在底層都做了些什麼?

 

當看到IL的時候再次醉了,其實=>僅僅是一個{}方法體括弧而已呀!這不是徒增我們的學習成本麽?然後我就繼續想,這裡的函數體就一條

console.wirteline語句,那我要是灌幾條語句會怎麼樣呢?可以想象肯定是要加括弧的,但是我真的加上{}後,編譯器凌亂了。。。

 

那這個圖就告訴我們,C#6.0的lamaba充當函數體的語法糖只適合一條語句,如果真要做到多條語句,那你只能單獨提取一個方法出來,

就像下麵這樣。

 

好了,上篇大體就這樣了,時間不早了,先撤了。

參考頁面:http://qingqingquege.cnblogs.com/p/5933752.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 註釋,是代碼中的一些“說明性文字”。註釋本身不會參與程式的編譯和運行,僅僅供程式員閱讀。 註釋分為:單行註釋、多行註釋、文檔註釋。 單行註釋的符號是2條斜線“//”,2條斜線右側的內容就是註釋,左側的代碼不會受影響。 多行註釋以“/*”開始,以“*/”結束,之間的內容就是註釋,可以包含多行。 文檔註 ...
  • OSS最新進度,包括OSS.Social,OSS.Http,新增微信支付項目OSS.PayCenter。 ...
  • 簡介 RabbitMQ:一個消息系統,基於 AMQP 系統協議,由 erlang 語言開發。 優點:健壯、使用簡單、開源和支持各種流行的語言等。 MQ(Message Queue):消息隊列的簡稱,是一種應用程式之間的通信機制。 作用:將部分無需立即回調獲取結果,並且耗時的操作,使用非同步處理的方式提 ...
  • 在開發商城系統的時候,大家會遇到這樣的需求,商城系統里支持多種商品類型,比如衣服,手機,首飾等,每一種產品類型都有自己獨有的參數信息,比如衣服有顏色,首飾有材質等,大家可以上淘寶看一下就明白了。現在的問題是,如果我程式發佈後,要想增加一種新的商品類型怎麼辦,如果不在程式設計時考慮這個問題的話,可能每 ...
  • 1..NET Core基本介紹 a 作為一個.NET的開發者,在以前的開發中,我們開發的項目基本都是部署在windows伺服器上,但是在windows伺服器上的話某些比較流行的解決訪問量的方案基本都是先出現在linux上,而後才能遷移出現windows上,而且效率處理方面也不再一個級別。曾經讓.NE ...
  • 一. 場景介紹: 如題如何有效的,最少量的現有代碼侵入從而實現客戶端與伺服器之間的數據交換加密呢? 二. 探究: 1.需求分析 webapi服務端 有如下介面: public class ApiTestController : ApiController { // GET api/<controll ...
  • 1.瀏覽器和伺服器的交互原理 答案是套接字:Socket。至於Socket的具體用法和原理,篇幅問題不在此文中寫了,先預留位置在這,下次補上《基於多線程和套接字的簡易WebServer軟體-沒有控制項的ASP.NET》。 瀏覽器和伺服器軟體通過套接字來發送和接收對方的信息,但現在的關鍵問題是,他們發送 ...
  • 例子: 1.關鍵字 class ,這個關鍵字的用途是聲明類,是C#程式最小單元,比如上面例子中,類名叫做Program。 2.關鍵字 namespace ,這個關鍵字的用途是聲明“命名空間”。比如上面例子中,命名空間叫做MyApp1。 3.關鍵字 using ,這個關鍵字的用途是導入命名空間。比如這 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...