一天一小步_我学C#入门精典_第六天

2,复杂的变量类型

  • 枚举
  • 结构
  • 数组

(1)枚举

有时希望变量提取的是一个固定集合中的值。例如,orientation类型可以存储north,south,east或west中的一个值。此时,就可以使用枚举类型。枚举就可以完成这个orientation类型的任务:它们允许定义一个类型,其中包含提供的限定值集合中的一个值。

所以需要创建自己的枚举类型orientation,它可以从上述的4个值中提取一个值。注意这是一个附加的步骤-不是仅仅声明一个给定类型的就是,而是声明和描述个个用户定义的类型,再声明这个新类型的变量。

定义枚举

枚举可以使用enum关键字来定义,如下所示:

 

enum typeName
{
    value1,
    value2,
    value3,
    
    valueN
}

 接着声明这个新类型的变量:

typeName varName;

并赋值:

varName = typename.value;

 枚举使用一个基本类型来存储。枚举类型可以提取的第个值都存储为该基本类型的一个值,在默认情况下,该类型为int。在枚举声明中添加类型,就可以指定其他基本类型:

enum typeName : underlyingType
{
    value1,
    value2,
    value3,
    
    valueN
}

 枚举的基本类型可以是byte,sbyte,short,ushort,int,uint,long和ulong.

在默认情况下,每个值都会根据定义的顺序(从0开始),自动赋给对应的基本类型值。这意味着value1的值是0,value2的值是1,value3的值是2等。

可以重写这个赋值过程:使用=去处符,并指定每个枚举的实际值:

enum typeName : underlyingType
{
    value1 
= actualVal1,
    value2 
= actualVal2,
    value3 
= actualVal3,
    
    valueN 
= actualValN
}

 另外,还可以使用一个值作为另一个枚举的基础值,为多个枚举指定相同的值:

enum typeName : underlyingType
{
    value1 
= actualVal1,
    value2 
= value1,
    value3 ,
    
    valueN 
= actualValN
}

 没有赋值的任何值都会自动获得一个初始值,这里使用的值是从比最后一个明确声明的值大1开始的序列。例如,在上面的代码中,value3的值是value1+1.

使用枚举:

test4 使用枚举

修改代码:

byte directionByte;
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型转换为枚举类型:

string directionString="north";//此字符串需能够映射为orientation的一个枚举值,如North会出错.
orientation myDirection 
= (orientation)Enum.Parse(typeof(orientation),directionString);
Console.WriteLine(myDirection);
//输出为north

(3)结构(struct,structure的简写)

 结构就是由几个数据组成的数据结构,这些数据可能 有不同的类型.根据这个结构,可以定义自己的变量类型.

例如,要存储从起点开始到某一位置的路由,其中路由由一个方向(orentation枚举来表示)和一个距离值(一个double类型表示)组成.

定义结构,结构使用stuct关键字来定义:

struct <typeName
{
    
<memberDeclarations>
}

<memberDeclarations>部分包含变量的定义(称为结构的数据成员).

例如:

stuct route
{
    
public orientation direction;//orientation枚举
    
public double distance;
}

 定义结构后就可以定义新类型的变量,来使用该结构:

route myRoute;

通过句点字符访问这个组合变量中的数据成员:

myRoute.direction = orientation.north;
myRoute.distance 
= 2.5;

 示例:使用结构

#region test8 结构的使用
/// <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


原文地址:https://www.cnblogs.com/soso_ak/p/1438797.html