C#6.0文法糖剖析

來源:互聯網
上載者:User

標籤:

1、自動屬性預設初始化

使用代碼

public string Id { get; set; } = "001";

編譯器產生的程式碼:

public class Customer { [CompilerGenerated] private string kBackingField = "hello world"; public Customer() { this.kBackingField = "hello world"; }public string Name{    [CompilerGenerated]    get    {        return this.<Name>k__BackingField;    }    [CompilerGenerated]    set    {        this.<Name>k__BackingField = value;    }}}

編譯器是在執行個體化建構函式時初始化屬性的。

2、自動唯讀屬性預設初始化

使用代碼

public string Name { get; } = "hello world";

編譯器產生的程式碼

[CompilerGenerated] private readonly string kBackingField; public Customer() {    this.kBackingField = "hello world";} public string Name1 {    [CompilerGenerated]     get { return this.k__BackingField; }}

唯讀屬性的賦值只能在建構函式中進行

3、運算式為主體的函數

使用代碼

private static void Test() => Console.WriteLine("Hello World!!");Body Get(int x, int y) => new Body(1 + x, 2 + y);

編譯器產生的程式碼

private Program.Body Get(int x, int y){    return new Program.Body(1 + x, 2 + y);}

 如果函數體只有一行代碼,採用運算式為主體的函數更加簡潔

也支援非同步函數的編寫

async void OutPut(int x, int y) => await new Task(() => Console.WriteLine("hello wolrd"));
4、運算式為主體的屬性(賦值)

使用代碼

public string Name => "Frank";

編譯器產生的程式碼

public string Name{     get { return "Frank"; }}

可以看出這個屬性是唯讀屬性

5、靜態類匯入

使用代碼

using static System.Console;private static void ListContacts(IEnumerable<Contact> contacts){    foreach (var contact in contacts)    {        WriteLine("{0,-6}{1,-6}{2,-20}{3,-10}", contact.Id, contact.Name, contact.EmailAddress, contact.PhoneNum);    }    WriteLine();}

它山之石可以攻玉,C#這次把Java的這個比較好的文法特性借鑒了過來,贊一個。

編譯器產生的程式碼

private static void ListContacts(IEnumerable<Contact> contacts){    foreach (var contact in contacts)    {        Console.WriteLine("{0,-6}{1,-6}{2,-20}{3,-10}", contact.Id, contact.Name, contact.EmailAddress, contact.PhoneNum);    }    Console.WriteLine();}
6、NULL條件運算子

使用代碼

Customer customer = new Customer();string name = customer?.Name;

編譯代碼

Customer customer = new Customer();if (customer != null){    string name = customer.Name;}

也可以和??組合起來使用

if (customer?.Face()??false)

還可以兩個一起組合來使用

 int? contactNameLen = contact?.Name?.Length; 

這個文法糖的目的是在對象使用前檢查是否為null。如果對象為空白,則賦值給變數為空白值,所以例子中需要一個可以為空白的int類型、即int?。如果對象不為空白,則調用對象的成員取值,並賦值給變數。

7、字串格式化

String.Format有些不方便的地方是:必須輸入"String.Format",使用{0}預留位置、必須順序來格式化、這點容易出錯。

var contactInfo = string.Format("Id:{0} Name:{1} EmailAddr:{2} PhoneNum:{3}", contact.Id, contact.Name, contact.EmailAddress, contact.PhoneNum);

新的文法

var contactInfo2 = $"Id:{contact.Id} Name:{contact.Name} EmailAddr:{contact.EmailAddress} PhoneNum:{contact.PhoneNum}";

使用起來順手多了,贊!

新格式化方式還支援任何錶達式的直接賦值:

var contactInfo = $"Id:{contact.Id} Name:{(contact.Name.Length == 0 ? "Frank" : contact.Name)} EmailAddr:{contact.EmailAddress} PhoneNum:{contact.PhoneNum}";

 

C#6.0文法糖剖析

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.