13.C#分部类型和静态类(七章7.1-7.2)
再大的东西不去找,也就没了,再小的知识不去记,也就忘了。今天来写一写C#中的分部类型和静态工具类,这些两个概念可能在我们的日常使用过程中都使用过,可能大家对这些内容觉得这些不是应该有的东西嘛,那就来复习一下吧。
分部类型,个人理解是对同一事物在两个不同空间的描述,编译器将组织我们编写的在不同文件中代码,组合成一个完整的描述。我们不能在一个文件中编写成员的一半代码,而把另外一半代码放到另外一个文件中,每个独立的成员必须完整地位于所处的文件中。如有一个Map类,成员属性放在Map0.cs中,而成员方法放在Map1.cs中,注意使用partial关键字。
1 //Map0.cs 2 public partial class Map 3 { 4 public long Width { get; set; } 5 public long Height { get; set; } 6 } 7 //Map1.cs 8 public partial class Map 9 { 10 public long GetSize() 11 { 12 return Width * Height; 13 } 14 }
还有一种常见的用法是当一个类要实现某一个接口同时继承某一个类时,分别在不同文件编写各自的实现。现有一个新类Canvas,代码如下
1 //Canvas0.cs 2 public partial class Canvas : IComparable 3 { 4 public int CompareTo(object obj) 5 { 6 return this.Price.CompareTo(((Canvas)obj).Price); 7 } 8 } 9 //Canvas1.cs 10 public partial class Canvas : Map 11 { 12 public double Price { get; set; } 13 }
由上可以看到在Canvas0.cs中是对IComparable接口的实现,而在Canvas1.cs中是对Map类的继承,不同文件分清了不同的功能。但我们在日常使用中,真心不用说要使用分部类型而去使用分部类型,不然文件多了,自己也搞不明白了,应该是不要刻意吧。分部类型的作用往往在于我们在编写自己的类时,后台帮我们生成一个使用partial的类,分清了代码文件的归属。
------------------------------------------------------------------------------------------------------
对于静态工具类,所有程序都会有自己编写的或者网上现有的工具类,常用如字符串操作类,数据库操作类等等。说下工具类的一些特点:
- 所有成员都是静态的(除了私有构造函数)
- 类直接从object中派生
- 不应该有状态,除非涉及高速缓存或单例
- 不能存在任何可见的构造函数
- 类是密封的
防止类派生,使用sealed关键字,添加一个私有构造函数防止创建实例,静态方法使用static关键字,这是C#1中创建工具类的方法,下面看代码,在C#后续版本中如何实现。
1 public static class StringHelper 2 { 3 public static int GetLen(string str) 4 { 5 return str.Length; 6 } 7 }
C#编译器知道类是一个静态类,所以不用生成一个默认构造函数。下面来抄下课本,罗列下编译器在类定义上执行的大量约束:
- 类不能声明为abstract或sealed
- 类不能设定要实现的接口
- 类不能设定要继承的基类
- 类不能包含任何非静态成员,包括构造函数
- 类不能包含任何操作符
- 类不能包含任何protected或protected internal成员
请斧正。