C#6語法糖

来源:http://www.cnblogs.com/luoyiShi/archive/2017/02/17/6410555.html
-Advertisement-
Play Games

Static Using static using聲明允許直接調用靜態方法而不需要指定類名: C# 5 C# 6 Expression-Bodied Methods 使用expression-bodied methods,一個只有一句statement的函數可以使用lambda寫法。 C# 5 C# ...


Static Using

static using聲明允許直接調用靜態方法而不需要指定類名:

C# 5

static void StaticUsingDemoInCSharp5(string output)
{
    Console.WriteLine(output); // Call the static method WriteLine with class name Console
}

C# 6

using static System.Console;

namespace NewFeatureTest
{
    class Program
    {
        static void Main(string[] args)
        {
            StaticUsingDemoInCSharp6("Hello, C# 6");
        }

        static void StaticUsingDemoInCSharp6(string output)
        {
            WriteLine(output);
        }
    }
}

Expression-Bodied Methods

使用expression-bodied methods,一個只有一句statement的函數可以使用lambda寫法。

C# 5

private static bool IsIntegerEqual(int a, int b)
{
    return a == b;
}

C# 6

private static bool IsIntegerEqualWithExpressionBodied(int a, int b) => a == b;

Expression-Bodied Properties

和expression-bodied methods類似,只支持get訪問器且只有一句statement的屬性(Properties)也可以使用lambda寫法。

C# 5

private string firstName;

public string FirstName
{
    get
    {
        return firstName;
    }
}

C# 6

private string lastName;

public string LastName => lastName;

Auto-Implemented Property Initializers

Auto-implemented  Property可以在一個屬性初始化器里初始化。

C# 5

public string Sex { get; set; }

public Person()
{
    Sex = "Male";
}

C# 6

public int Age { get; set; } = 42; // The age will be initialized to 42 when object constructed

Read-Only Auto Properties

在之前的C#版本中,只讀屬性要求完整的屬性語法。C#6提供了自動實現的版本:

C# 5

private readonly string homeTown;

public string HomeTown { get { return homeTown; } }

C# 6

public string BirthDay { get; }
public Person(string _firstName, string _lastName)
{
        BirthDay = DateTime.Today.ToString();
}

nameof Operator

使用最新的nameof操作符,欄位(fields)、屬性(Properties)、方法和類型的名字都能被取到。有了它,媽媽在也不用擔心改名字的時候會漏掉啦。

C# 5

public bool IsAdult(int age)
        {
            if (age < 0)
            {
                throw new ArgumentException("age");
            }

            return age >= 18;
        }

C# 6

public bool IsAdultWithNameOfOperator(int age)
        {
            if (age < 0)
            {
                throw new ArgumentException(nameof(age));
            }

            return age >= 18;
        }

Null Propagation Operator

null propagation操作符能夠大大滴簡化空對象的檢查。

C# 5

public Person(int? _age)
{
    Age = _age == null ? -1 : _age.Value;
}

C# 6

public Person(DateTime? _birthDay)
{
    birthDay = _birthDay?.ToString();
}

String Interpolation

在c#6中,字元串插值不需要再call string.Format方法啦。相較於之前在string中使用數字占位符如{0},C#6支持表達式占位符如{age}。

C# 5

public override string ToString()
{
    return string.Format("{0} {1}”, firstName, lastName);
}

C# 6

public override string ToString() => $"{firstName} {lastName}";

在這裡,我們使用了新的string interpolation和expression-bodied method讓整個代碼相較於之前簡潔很多(按代碼行數算錢的碼農悲催了)。

Dictionary Initializers

在C# 6中,我們可以像集合初始化器一樣使用字典(Dictionary)初始化器來初始化字典對象。

C# 5

var dictInCSharp5 = new Dictionary<int, string>()
{
    {2, "Two"},
    {1, "One"}
};

C# 6

var dictInCSharp6 = new Dictionary<int, string>()
{
    [2] = "Two",
    [1] = "One"
};

這東西個人覺得沒什麼用,反而容易和Collection的下標混淆。

Exceptions Filters

異常過濾器允許我們在catch異常之前使用條件來過濾異常。

C# 5

try
{
    StaticUsingDemoInCSharp6(p.LastName);
}
catch (Exception e)
{
    if (e.Message.Contains("Aha"))
    {
        throw;
    }
}

C# 6

try
{
    StaticUsingDemoInCSharp6(p.LastName);
}
catch(Exception e) when (e.Message.Contains("Aha"))
{
    throw;
}

Await in Catch

C#6允許我們在catch程式塊裡面使用await關鍵字。在c#5我們只能workaround。

C# 5

private static async Task AwaitInCatchDemoInCSharp5()
{
    bool hasError = false;
    string errorMessage = string.Empty;

    try
    {
        throw new FieldAccessException("No Permission.");
    }
    catch(FieldAccessException e)
    {
        hasError = true;
        errorMessage = e.Message;
    }

    if(hasError)
    {
        await MessageDialog().ShowAsync(errorMessage);
    }
}

C# 6

private static async Task AwaitInCatchDemoInCSharp5()
{

    try
    {
        throw new FieldAccessException("No Permission.");
    }
    catch(FieldAccessException e)
    {
        await MessageDialog().ShowAsync(e.Message);
    }

}

參考: 《Professional C#6 and .NET Core 1.0》


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

-Advertisement-
Play Games
更多相關文章
  • 等待隊列 是內核中實現進程調度的一個十分重要的數據結構,其任務是維護一個鏈表,鏈表中每一個節點都是一個PCB(進程式控制制塊), 內核會將PCB掛在等待隊列中的所有進程都調度為睡眠狀態,直到某個喚醒的條件發生 。應用層的阻塞IO與非阻塞IO的使用我已經在 "Linux I/O多路復用" 一文中討論過了, ...
  • 簡介 RabbitMQ:一個消息系統,基於 AMQP 系統協議。 優點:健壯、使用簡單、開源和支持各種流行的語言等。 MQ(Message Queue):消息隊列的簡稱,是一種應用程式之間的通信機制。 用途:將無需立即回調獲取返回結果,並且耗時的操作,使用非同步處理的方式提高伺服器的吞吐量及性能。 ...
  • 初步應用vs2012這軟體,語言選擇c# , 框架選擇4(不要選擇最前和太後的框架)然後改個名字和保存路徑點確定就行了。 在main函數中寫代碼,大括弧裡面。 首先是最基本的輸入與輸出: Console.WriteLine(");//直接會輸出引號裡面的內容(如果直接寫入Write的話就不會換行。) ...
  • 電子面單開發流程 服務程式 生成單號,改變三個表: 抓類型表,抓取未處理的充值記錄->根據類型取面單類型表的最大單號(判斷是否在起始和結束之間,並設置郵件或者簡訊預警 )->根據單號規則和充值的數量生成單號明細入單號明細表,改變充值記錄的處理狀態 改變面單類型最大單號(事務提交)。 ...
  • 經過本周的努力,昨晚終於完成OSS.Social微信項目的標準庫支持,當前項目你已經可以同時在.net framework和.net core 中進行調用,調用方法也發生了部分變化,這裡我簡單分享下,主要包含下邊幾個部分: · 移植後的變化 · 和OSS.Common,OSS.Http關係 · 非同步 ...
  • #define aaa //放在代碼最前面 int a = 1; a = a + 1; #if !aaa {a = a + 1;}#elif !aaaaa {a=a+11;}#endif Console.WriteLine(a); Console.ReadKey(); 據說與版本有關 ,#undef ...
  • 為什麼叫T4?因為簡寫為4個T。 T4(Text Template Transformation Toolkit)是微軟官方在VisualStudio 2008中開始使用的代碼生成引擎。在 Visual Studio 中,“T4 文本模板”是由一些文本塊和控制邏輯組成的混合模板,它可以生成文本文件。 ...
  • 在大型網站系統中,為了提高系統訪問性能,往往會把一些不經常變得內容發佈成靜態頁,比如商城的產品詳情頁,新聞詳情頁,這些信息一旦發佈後,變化的頻率不會很高,如果還採用動態輸出的方式進行處理的話,肯定會給伺服器造成很大的資源浪費。但是我們又不能針對這些內容都獨立製作靜態頁,所以我們可以在系統中利用偽靜態 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...