一天一小步_我学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.

使用枚举:

 

ContractedBlock.gif ExpandedBlockStart.gif test4 使用枚举 #region test4 使用枚举
ExpandedSubBlockStart.gifContractedSubBlock.gif
/**//// <summary>
/// test4
/// 使用枚举
/// </summary>

public void test4()
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
    orientation myDirection 
= orientation.north;
    Console.WriteLine(
"myDirection ={0}", myDirection);
    Console.ReadKey();
}

ExpandedSubBlockStart.gifContractedSubBlock.gif
/**//// <summary>
/// 枚举
/// </summary>

enum orientation : byte
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
    north 
= 1,
    south 
= 2,
    east 
= 3,
    west 
= 4
}


修改代码:

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/archive/2009/04/18/1438797.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值