1. 程式人生 > 實用技巧 >深入解析C# 4th 筆記(第一章)

深入解析C# 4th 筆記(第一章)

目錄

型別系統-全能性助手

泛型(generic)

用C# 1 寫的程式碼如下

    public class Bookshelf
    {
        public IEnumerable Books { get {...} }
    }

Books這個型別中到底有些什麼,我們完全看不出來,因為型別系統無法告訴我們,但是在C# 2 中就容易看出來了

    public class Bookshelf
    {
        public IEnumerable<Books> Books { get {...} }
    }

可空值型別(nullable value type)

在C# 2 中引入,用來表示沒有定義的變數值。

readonly struct

在C# 7 中引入,用於將自定義結構體宣告為不可變型別

可空引用型別(nullable reference type)

在C# 8 中引入,C#8 中假設任何沒有顯式宣告為可空的值都為非可空值

匿名型別(anonymous type)和隱式區域性變數(var)

在C# 3 中引入,用於解決靜態型別語言的缺陷:程式碼冗餘

元組 (tuple)

在C# 7 中引入

程式碼更簡潔

構造和初始化

委託(delegate)的演化

button.Click += new EventHandler(Button_Click);//C#1
button.Click += Button_Click;//C#2
button.Click += delegate { MessageBox.Show("Test"); };//C#2
button.Click += (sender, e) => { MessageBox.Show("Test"); };//C#3

LINQ 的物件初始化器和集合初始化器

曾經是:

var customer = new Customer();
customer.Name = "Jon";
customer.Address = "UK";
var item1 = new OrderItem();
item1.ItemId = "abcd123";
item1.Quantity = 1;
var item2 = new OrderItem();
item2.ItemId = "fgh1456";
item2.Quantity = 2;
var order = new Order();
order.OrderId = "xyz";
order.Customer = customer;
order.Items.Add(item1);
order.Items.Add(item2);

在C# 3 中引入物件初始化器和集合初始化器後

var order = new Order
{
    OrderId = "xyz",
    Customer = new Customer { Name = "Jon", Address = "UK" },
    Items =
    {
        new OrderItem { ItemId = "abcd123", Quantity = 1 },
        new OrderItem { ItemId = "fgh1456", Quantity = 2 }
    }
};

方法與屬性宣告

自動實現的屬性

在C# 3 中出現

出現前:

private int index;

public int Index
{
    get { return index; }
    set { index = value; }
}

出現後:

public int Index { get; set; }

表示式主體成員(expression-bodied member )

在C# 6中引入

例:封裝一個 string 集合類,該集合有 Count 和 GetEnumerator() 兩個成員

C# 6 前

public int Count { get { return list.Count; } }

public IEnumerator<string> GetEnumerator()
{
    return list.GetEnumerator();
}

C# 6 中使用 = >

public int Count => list.Count;

public IEnumerator<string> GetEnumerator() => list.GetEnumerator();

字串處理

呼叫方資訊(caller information attribute)

在C# 5 中引入 通過這項特性,編譯器可以將方法名和檔名自動填充到引數值中

nameof 運算子

在C# 6 中引入 用於獲取變數、型別、方法或成員的名字

內插字串字面量(interpolated string literal)

在C# 6 中引入

LINQ

在C# 3 中引入 LINQ使用 表示式樹 來完成程序外資料的查詢操作

非同步

在C# 5 中引入了 async/await機制 簡化了非同步程式設計模式