Focus 2 怎样创建用户自定义类型呢?
用户自定义值类型叫结构(structures或者structs)。
和别的子类型一样,自定义值类型的数据也存储在栈上,并且是直接存储该数值。
在大多数情况下,结构的行为接近类。
最简单的例子是System.Drawing.Point
System.Drawing.Point p=new System.Drawing.Point(20,30);
p.Offset(-1,-1);
Console.WriteLine("Point X{0},Y{1}",p.X,p.Y);
如:
struct Cycle
{
//内部字段
int _val,_min,_max;
//构造函数
public Cycle(int min,int max)
{
_val=min;
_min=min;
_max=max;
}
public int Value
{
get{ return _val; }
set{
if(value>_max)
{
_val=_min;
}
else{
if(value<_min)
{
_val=_max;
}
else{
_val=value;
}
}
}
}
public override string ToString()
{
return Value.ToString();
}
public int ToInteger()
{
return Value;
}
//操作符定义
public static Cycle operator +(Cycle arg1,int arg2)
{
arg1.Value+=arg2;
return arg1;
}
public static Cycle operator -(Cycle arg1,int arg2)
{
arg1.Value-=arg2;
return arg1;
}
}
调用时:
Cycle degrees = new Cycle(0,359);
Cycle quarters = new Cycle(1,4);
for(int i=0;i<=8;i++)
{
degree + =90;
quarters+=1;
Console.WriteLine("degrees={0},quarters={1}",degrees,quarters);
}
该示例中的Cycle可以很容易的转换成类,只要把structure/struct关键字改为Class即可。
如果做这种转换,Cycle类的数据将被分配到托管堆(managed heap)上,而不是在栈上开辟12个字节(每一个整型字段占4个字节),并且在变量间赋值时使用同一个数据并把两个变量指针指向该数值。
功能相似的类和结构相比较,结构体要比类更有效。
都能满足需要的情况下我们应该尽量的使用结构体,而不是类。
因为如果你定义结构体将比定义同样功能的类有更好的执行效果。
建议在如下情况下多使用结构体:
逻辑展现单一的数据
实例数值的大小小于16个字节的数据
创建以后就不再修改的数据
创建后一直作为值类型使用而不需要转换为引用类型的数据
Focus 3 如何创建枚举(Enumerations)?
枚举是一组相关的拥有固定数值的标签。
枚举可以为开发者使用你的类提供一些列的选择项标签。
如:
enum Titles:int{Mr,Ms,Mrs,Dr};
当你创建这样一个枚举Titles的实例时,在你给变量赋值时你将会得到一系列的可用的标签,来标识相应的数值。
如:
Titles t = Titles.Dr;
Console.WriteLine("{0}." t);//显示为"Dr."
枚举的使用主要是通过富有意义的标签代替简单的数字来简化编码增加代码的可阅读性。
在要求开发者使用数值必须从一些列的规定数值中选择时,常将这些数值定义为枚举类型。
关于值类型的总结:
.NET Framework 包含了大量的内建类型的数值,我们可以直接使用和用他们来定义自己的数据类型。
值类型数据直接存储自己,提供很好的执行性。然而,值类型只能存储较小的数据,在.NET Framework 中所有的值类型数据都不超过16字节。
我们可以创建自己的数据类型来存贮多个数值和方法,在面向对象开发过程中将大量使用这样的自定义类型。
枚举可以通过给一系列数值定义标签来提高代码的可阅读性。