C#6.0語法糖剖析(一)

FrankYou發表於2015-07-31

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}";

 

相關文章