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