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