標籤:
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文法糖剖析