【整理】C#2.0特性之局部类、空属类型和静态类
局部类
在没有局部类出现之前,我们采用下面方法定义类:
有了局部类之后,可将上述类拆分成如下两个局部类
局部类型简介
1.局部类型允许我们将一个类型(类、结构体或接口)分成多个部分,分别是现在几个不同的cs文件中
2.局部类型实用于以下两种情况
第一 类型特别大,不宜放在一个类中实现
第二 一个类中的一部分代码是由自动工具生成的代码,不宜与我们编写的代码放到一起
3.局部类型是一个纯语言层的编译处理,不影响任何执行机制,IL在编译时会自动将局部类合称为一个完整的类。
局部类型的限制
1.局部类型只适用于类、接口和结构体,不支持委托和枚举。
2.同一个类型的各个部分都必须有修饰符partial
3.使用局部类时,一个类的各个部分必须放在相同的命名空间
4.一个类的各个部分必须被同时编译。换言之,就是C#不允许对一个类的各个部分单独编译。
局部类型的几个注意点
1.关键字partial只有和class、interface与struct放在一起的时候才有关键字的意义。因此partial的引入不会影响代码中现有的名称为partial的变量。
2.局部类型的个数并非必须是两个或两个以上,也可以是单独一个,不过这样做没意义。
3.局部类型的各个部分一般是放在不同的cs文件中的,但是C#也允许放在同一个cs文件中
局部类上应用特性
局部类的特性具有"累加"效应,举例如下:
[Attr1,Attr2("Hello")]
partial class A{......}
[Attr3,Attr2("GoodBye")]
partial class A{......}
相当于如下代码:
[Attr1,Attr2("Hello"),Attr3,Attr2("GoodBye")]
class A{......}
局部类上的访问修饰符
1.一个类型各个部分上的访问保护修饰符必须维持一致
2.如果一个类的某个部分上使用了abstract,那么这个类将被视为抽象类
3.如果一个类的某个部分上使用了sealed,那么这个类将被视为密封类
4.一个类的各个部分不能使用相互矛盾的修饰符,比如一个是abstract,一个是sealed
局部类型的基类和接口
1.一个类的各个部分的基类必须相同。因为C#不允许类的多重继承
2.局部类型上的接口具有"累加"效应,换言之如下代码
partial class A:IA,IB{...}
partial class A:IC{...}
partial class A:IA,IB{...}
等价于
class A:IA,IB,IC{...}
空属类型
空属类型简介
空属类型允许一个值类型具有"空值"意义,从而方便很多场合的运算,如数据库中的空字段。
空属类型本身就是一个值类型
空属类型演示:
int i = 123;
int? x = i; //等价于System.Nullable<int> x = new System.Nullable<int>(i);
double? y = x;
int? z = (int?)y;//空属类型支持强制转换
int? x = null;//同下面是不一样的,注意一下就是了
object obj=null;//表示obj不指向托管堆的任何内存空间,ojb的引用指针为0,即无效指针。
空属类型四则运算
运算结果
值类型与空属类型下Equals的特点
演示结果
空属类型的几个注意点
1.空属类型实际上是一个泛型类型System.Nullable<T>。空属类型的基础类型就是泛型类型System.Nullable<T>中的T,其中T必须为值类型。
2.空属类型如果值不为空,可以使用同基础类型相同的运算,如加、减、乘和除操作
3.空属类型的HasValue用来判断空属类型是否为空,如果不为空,则可以通过Value属性获取它的基础类型的值。
静态类
静态类简介
静态类是只包含静态成员的类型,它既不能实例化,也不能被继承。它相当于一个sealed abstract类
静态类演示
static class MyUtility
{
public const int data;
public static void Main()
{...}
}
静态类的几个注意点
静态类不能有实例构造器。
静态类不能有实例成员。
静态类上不能使用sealed和abstract关键字。
静态类默认继承自System.Object类,不能显式的指定任何其他基类。
静态类不能指定任何借口实现。
静态类的成员不能有protected或protected internal访问修饰符。