深入解析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机制 简化了异步编程模式

原文地址:https://www.cnblogs.com/wu-xin/p/14163105.html