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


  • 相关阅读:
    07_zookeeper的客户端工具curator_基本api
    06_zookeeper原生Java API使用
    05_zookeeper的ACL
    04_zookeeper的watcher机制
    03_Zookeeper基本数据模型及基本命令操作
    02_zookeeper配置
    01_Zookeeper简述
    thinkphp之url的seo优化
    thinkphp Upload上传文件在客户端生成的临时文件$_FILES['file']['tmp_name']
    php过滤表单输入的emoji表情
  • 原文地址:https://www.cnblogs.com/soso_ak/p/1438797.html
Copyright © 2020-2023  润新知