2,复杂的变量类型
- 枚举
- 结构
- 数组
(1)枚举
有时希望变量提取的是一个固定集合中的值。例如,orientation类型可以存储north,south,east或west中的一个值。此时,就可以使用枚举类型。枚举就可以完成这个orientation类型的任务:它们允许定义一个类型,其中包含提供的限定值集合中的一个值。
所以需要创建自己的枚举类型orientation,它可以从上述的4个值中提取一个值。注意这是一个附加的步骤-不是仅仅声明一个给定类型的就是,而是声明和描述个个用户定义的类型,再声明这个新类型的变量。
定义枚举
枚举可以使用enum关键字来定义,如下所示:
{
value1,
value2,
value3,
valueN
}
接着声明这个新类型的变量:
并赋值:
枚举使用一个基本类型来存储。枚举类型可以提取的第个值都存储为该基本类型的一个值,在默认情况下,该类型为int。在枚举声明中添加类型,就可以指定其他基本类型:
{
value1,
value2,
value3,
valueN
}
枚举的基本类型可以是byte,sbyte,short,ushort,int,uint,long和ulong.
在默认情况下,每个值都会根据定义的顺序(从0开始),自动赋给对应的基本类型值。这意味着value1的值是0,value2的值是1,value3的值是2等。
可以重写这个赋值过程:使用=去处符,并指定每个枚举的实际值:
{
value1 = actualVal1,
value2 = actualVal2,
value3 = actualVal3,
valueN = actualValN
}
另外,还可以使用一个值作为另一个枚举的基础值,为多个枚举指定相同的值:
{
value1 = actualVal1,
value2 = value1,
value3 ,
valueN = actualValN
}
没有赋值的任何值都会自动获得一个初始值,这里使用的值是从比最后一个明确声明的值大1开始的序列。例如,在上面的代码中,value3的值是value1+1.
使用枚举:
修改代码:
string directionString;
orientation myDirection = orientation.north;
Console.WriteLine("myDirecion = {0}",myDirection);
directionByte = (byte)myDirection;//把枚举转换成byte型,虽然orientation基本类型是byte型,但仍要用显示转换.
directionString = Convert.ToString(myDirection);//myDirection.ToString();
Console.WriteLine("byte equivalent = {0}", directionByte);
Console.WriteLine("string equivalent ={0}", directionString);
Console.ReadKey();
也可以将string型转换为枚举类型:
orientation myDirection = (orientation)Enum.Parse(typeof(orientation),directionString);
Console.WriteLine(myDirection);//输出为north
(3)结构(struct,structure的简写)
结构就是由几个数据组成的数据结构,这些数据可能 有不同的类型.根据这个结构,可以定义自己的变量类型.
例如,要存储从起点开始到某一位置的路由,其中路由由一个方向(orentation枚举来表示)和一个距离值(一个double类型表示)组成.
定义结构,结构使用stuct关键字来定义:
{
<memberDeclarations>
}
<memberDeclarations>部分包含变量的定义(称为结构的数据成员).
例如:
{
public orientation direction;//orientation枚举
public double distance;
}
定义结构后就可以定义新类型的变量,来使用该结构:
通过句点字符访问这个组合变量中的数据成员:
myRoute.distance = 2.5;
示例:使用结构
/// <summary>
/// 测试test8
/// </summary>
public void test8()
{
route myRoute;//初始化结构
int myDirection = -1;
double myDistance;
Console.WriteLine("1) North\n2) South\n3) East\n4) West");//用户选择
//把方向放在do循环中对用户的输入进行有效性检查,如果输入的信息不是1~4之间的整数,就会拒绝它
do
{
Console.WriteLine("Select a direction:");
myDirection = Convert.ToInt32(Console.ReadLine());
}
while ((myDirection) < 1 || (myDirection > 4));
Console.WriteLine("Input a distance:");
//赋值,可以直接将值放入结构route中
//myRoute._direction = Convert.ToDouble(Console.ReadLine());
myDistance = Convert.ToDouble(Console.ReadLine());//输入一个距离值
myRoute._direction = (_orientation)myDirection;
myRoute.distance = myDistance;Console.WriteLine("myRoute specifies a direction of {0} and a distance of {1} ", myRoute._direction, myRoute.distance);
Console.ReadKey();
}
/// <summary>
/// 枚举
/// </summary>
enum _orientation : byte
{
north = 1,
south = 2,
east = 3,
west = 4
}
/// <summary>
/// 结构
/// </summary>
struct route
{
public _orientation _direction;//方向
public double distance;//距离
}
#endregion