CSharp 2
C# 2 引入的各项特性让其风格发生了巨大变化,其中泛型与可空类型已是C#的重要组成部分。
1. 泛型
引入泛型后,可以编写在编译时类型安全的通用代码。无需事先知道要使用的具体类型,即可在不同位置表示相同的类型。
2. 从Array, ArrayList到List<T>
3. 泛型约束
类型 | 写法 |
---|---|
引用类型约束 | where T : class |
值类型约束 | where T : struct |
构造器约束 | where T : new() |
接口/类约束 | where T : SomeType |
4. 静态构造方法
i. 无参数。ii. 无访问修饰符。 iii. 只在加载时调用,并且只调用一次。
1 | public class ClassA |
5. 可空类型
C#1时代,null只表示引用为空,但是经常会出现某些字段是需要为空。如果被引用就会出现NullReferenceException
。而当时的解决方案是:
- 加一个字段记录这个字段是不是空的。
- 用一个默认值表示为空,如:最大值。
C#2 引入可空类型 Nullable<T>
,null不仅可以表示引用为空,还可以表示可空类型的HasValue 为false。下面的两个写法相同:
1 | // 写法一 |
问号语法糖
1 | // 可空类型 |
6. 提出 匿名方法
拓展了泛型迭代器
迭代器是包含迭代器块的方法或属性。其中IEnumerable
是可用于迭代的序列,IEnumerator
则是像序列的游标卡尺。IEnumerator
每次调用MoveNext()
,游标都向前移动一个元素。
- yield return 用于生成返回序列的各个值。
- yield break 用于终止返回序列。
7. 分部类型(partial)
分部类型可以将:类,结构体或者接口分成多个部分声明,而且一般分布在多个源文件中。通常用在代码生成器生成的代码和自定义的代码,如:winform中的窗体设计器生辰的代码与我们手动编写的代码就是拆分成了两个文件,如下:
1 | // ClassA.cs |
C#3中增加了局部方法,见下篇文章。
8. 新增静态类
静态类的主要目的就是写一些工具类。特点是:
- 静态类的所有成员都是静态的(除了私有构造方法)
- 不能存在公有构造方法,当然也不用单独再把构造方法标记为私有。
9. 属性器getter/setter允许添加访问修饰符
比如允许外部获取字段,不允许外部修改,或者修改数据时在set块中进行数据校验。
1 | private class ClassA |
10. 命名空间重命名
当引用的两个程序集拥有同一个类时,如:UnityEngine.Object
与System.Object
。这个时候就可以用using
关键字对命名空间进行重命名:
1 | using UObject = UnityEngine.Object; |