C#6.0新特性的嘗試

来源:http://www.cnblogs.com/summit7ca/archive/2016/03/25/5319647.html
-Advertisement-
Play Games

由於項目升級到了.NetFramework 4.6.1,開發工具轉向了vs2015,趁機嘗試下C#6.0.結果在網上搜的一些教程總結的不是太完整,有的代碼隨著vs正式版的發佈也有所修改.那些個教程也沒更新.所以把自己學習到的記錄一下. 1.自動屬性初始化(Auto-property initiali ...


由於項目升級到了.NetFramework 4.6.1,開發工具轉向了vs2015,趁機嘗試下C#6.0.結果在網上搜的一些教程總結的不是太完整,有的代碼隨著vs正式版的發佈也有所修改.那些個教程也沒更新.
所以把自己學習到的記錄一下.

1.自動屬性初始化(Auto-property initializers)

    public class Account
    {

        public string Name { get; set; } = "summit";

        public int Age { get; set; } = 22;

        public IList<int> AgeList
        {
            get;
            set;
        } = new List<int> { 10,20,30,40,50 };

    }

 對於只讀屬性也可以這樣直接初始化(C#5.0不支持),也可以直接在構造函數里初始化

public class Customer
{
    public string Name { get; }
    public Customer(string first, string last)
    {
        Name = first + " " + last;
    }
}

2.字元串嵌入值(String interpolation)


在之前版本的String.Format中有多少個參數就要寫多少個占位符還必須按照順序,否則就報錯.參數一多,這樣搞的話確實頭疼.新版本中在字元串前用$來標識後邊的字元可以使用{對象}來作為占位符.看個例子.

Console.WriteLine($"年齡:{account.Age}  生日:{account.BirthDay.ToString("yyyy-MM-dd")}");
Console.WriteLine($"年齡:{account.Age}");
Console.WriteLine($"{(account.Age<=22?"小鮮肉":"老鮮肉")}");

如果想輸出{或}符號,寫兩個即可,如$"{{".
註意這個$符號,網上的N多教程都是沒有這個東東的.是直接"\{ account.Age \}",這種方式在新版本里已經被拋棄了.

3.導入靜態類(Using Static)


像之前使用Math這個靜態類的時候要先導入System命名空間後才能使用它.現在可以直接導入這個靜態,然後代碼中直接使用其函數.

using static System.Math;//註意這裡不是命名空間哦

Console.WriteLine($"之前的使用方式: {Math.Pow(4, 2)}");
Console.WriteLine($"導入後可直接使用方法: {Pow(4,2)}");

註意這裡是using static ...
如果某個命名空間下有n個方法,用這種方式直接引入單個靜態類而不用引用所有方法還是挺方便的.

4.空值運算符(Null-conditional operators)


之前寫過無數個這樣的判斷代碼

if (*** != null)
{
     //不為null的操作
}
return null;

現在使用可以簡化這樣方式.

var age = account.AgeList?[0].ToString();

Console.WriteLine("{0}", (person.list?.Count ?? 0));

如果account.AgeList為空則整個表達式返回空,否則後邊的表達式的值.

5.對象初始化器(Index Initializers)


這種方式可以給字典或其他對象通過索引賦值初始化.

IDictionary<int, string> dict = new Dictionary<int, string>() {
       [1]="first",
       [2]="second"
};
foreach(var dic in dict)
{
    Console.WriteLine($"key: {dic.Key} value:{dic.Value}");
}

output:
key: 1 value:first
key: 2 value:second

6.異常過濾器(Exception filters)

private static bool Log(Exception e)
{
    Console.WriteLine("log");
    return true;
}
static void TestExceptionFilter()
{
    try
    {
        Int32.Parse("s");
    }
    catch (Exception e) when (Log(e))
    {
        Console.WriteLine("catch");
        return;
    }
}

當when()裡面返回的值不為true,將持續拋出異常,不會執行catch裡面的方法.

7.nameof表達式 (nameof expressions)

在對方法參數進行檢查時經常這樣寫:
private static void Add(Account account)
{
     if (account == null)
         throw new ArgumentNullException("account");
}

如果某天參數的名字被修改了,下麵的字元串很容易漏掉忘記修改.
使用nameof表達式後,編譯的時候編譯器將檢查到有修改後自動導航與重構(-_-! 不知道翻譯的對不對)
private static void Add(Account account)
{
     if (account == null)
         throw new ArgumentNullException(nameof(account));
}

8.在cath和finally語句塊里使用await(Await in catch and finally blocks)

c#5.0里是不支持這麼寫.

Resource res = null;
try
{
    res = await Resource.OpenAsync(…);       // You could do this.
    …
} 
catch(ResourceException e)
{
    await Resource.LogAsync(res, e);         // Now you can do this …
}
finally
{
    if (res != null) await res.CloseAsync(); // … and this.
}

9.在屬性里使用Lambda表達式(Expression bodies on property-like function members)

public string Name =>string.Format("姓名: {0}", "summit");

public void Print() => Console.WriteLine(Name);

10.在方法成員上使用Lambda表達式

static int LambdaFunc(int x, int y) => x*y;

public void Print() => Console.WriteLine(First + " " + Last);

 

關於C#6.0新增加的語言特性目前為止也就這麼多.沒有什麼新功能,更多的是語法糖的改進.開發更舒服更快速. 
最後附上github上關於c#6.0的相關介紹鏈接:點我點我

  

 


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

-Advertisement-
Play Games
更多相關文章
  • 我在前面一篇隨筆《Socket開發框架之框架設計及分析》中,介紹了整個Socket開發框架的總體思路,對各個層次的基類進行了一些總結和抽象,已達到重用、簡化代碼的目的。本篇繼續分析其中重要的協議設計部分,對其中消息協議的設計,以及數據的拆包和封包進行了相關的介紹,使得我們在更高級別上更好利用Sock ...
  • 之前我喜歡只是單純的記記筆記,沒有什麼寫文章的習慣,今天也是我一邊研究一邊學習,索性就連過程什麼的都記錄下吧,或許能幫到一兩個朋友呢。 首先,我們來想想什麼叫做單例,顧名思義,單一的一個對象,那麼,單一模式有什麼好處呢?比如說,你的對象只可以實例化一次等等。 先寫一個簡單的測試里的例子吧,比如我建一 ...
  • 本系列目錄: 《1、搜索有聲小說》 《2、分析詳細頁地址》 《3、批量下載mp3》 本篇是大結局,看過前兩篇的放心吧,不會有第四篇了,軟體的下載地址,軟體完成的效果大家自己看吧。 一、查找mp3文件的下載地址 我們首先要獲取其下載地址,在評書的詳細頁中沒有找到,我們進入播放頁面,看看能找到什麼,如下 ...
  • 百度:ef5 mysql http://my.oschina.net/u/170703/blog/210814?p=1 百度:dotconnect for mysql 破解 可以找到極限軟體網站上的 dcmysql的破解版 {"創建 entityFramework 的配置節處理程式時出錯: 未能載入 ...
  • 本篇之所以起這樣一個名字,是因為重點並非如何自定義控制項,不涉及創建CustomControl和UserControl使用的Template和XAML概念。而是通過繼承的方法來擴展一個現有的類,在繼承的子類中增加屬性和擴展行為。 我們在《UWP開發入門(七)——下拉刷新》中提到過嵌套ScrollVie ...
  • 一、Git簡介 1.Git是什麼 Git是分散式版本控制系統 2.Git有什麼特點 (1)Git是分散式的SCM,SVN是集中式的 (2)Git每個歷史版本存儲完整的文件,SVN存儲文件差異 (3)Git可離線完成大部分操作,SVN則相反 (4)Git有著更優雅的分支和合併實現 (5)Git有著更強... ...
  • 學習如何在MVC項目中配置AutoMapper。 一:首先在MVC項目中引用AutoMapper的DLL文件,接著創建一個介面,這裡面我們需要定義兩個方法,介面裡面的方法只能定義不能實現,也沒有什麼修飾符,實現介面的類必須實現裡面全部的方法。 定義介面IStartupTask,裡面有兩個方法。 pu... ...
  • 一、開發環境 編譯器:VS2013 .Net版本:4.5 二、開發過程 1.畫一條直線 private void btnDrawLine_Click(object sender, EventArgs e) { //創建一個畫圖圖面 Graphics g = this.CreateGraphics()... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...