结构

  在一个要介绍的变量类型是结构( struct,structure的缩写 )。结构就是由几个数据组成的数据结构,这些数据可能具有不同的类型。根据这个结构,可以定义自己的变量类型。例如,假定要存储从起点开始到某一位置的路径,其中路径由一个方向和一个距离值(英里)组成。为简单起见,假定该方向是指南针上的一点(这样,方向就可以用上一节的 orientation 枚举来表示),距离值可以用一个 double 类型来表示。

  通过前面的代码,可用两个不同的变量来表示该路径:

  1. orientation myDirection;
  2. double myDistance;

  像这样使用两个变量,是没有错误的,但在一个地方存储这些信息更加简单(在需要多个路径时,就尤为简单)。

定义结构

  使用 struct 关键字来定义结构,如下所示:

  1. struct <typeName>
  2. {
  3. <memberDeclarations>
  4. }

  <memberDeclarations> 部分包含变量的声明(称为结构的数据成员),其格式与前面的变量声明一样。每个成员的声明都采用如下形式:

  1. <accessbility> <type> <name>;

  要让调用结构的代码访问该结构的数据成员,可以对 <accesssibility> 使用关键字 public,例如:

  1. struct rout
  2. {
  3. public orientation direction;
  4. public double distance;
  5. }

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

  1. rout myRoute;

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

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

  把这个类型放在下面的 “试一试”示例中,其中使用上一节的 orientation 枚举和上面的 route 结构。本例在代码中处理这个结构,以便你了解结构的工作原理。

将下列代码添加到 Program.cs 中:

  1. namespace Ch05Ex03
  2. {
  3. enum orientation : byte
  4. {
  5. north = 1,
  6. south = 2,
  7. east = 3,
  8. west = 4
  9. }
  10. struct route
  11. {
  12. public orientation direction;
  13. public double distance;
  14. }
  15. class Program
  16. {
  17. static void Main(string[] args)
  18. {
  19. route myRoute;
  20. int myDirection = -1;
  21. double myDistance;
  22. Console.WriteLine("1) North\n2) South\n3) East\n4) West");
  23. do
  24. {
  25. Console.WriteLine("Select a direction");
  26. myDirection = Convert.ToInt32(Console.ReadLine());
  27. } while ((myDirection < 1) || (myDirection > 4));
  28. Console.WriteLine("Input a distance:");
  29. myDistance = Convert.ToDouble(Console.ReadLine());
  30. myRoute.direction = (orientation)myDirection;
  31. myRoute.distance = myDistance;
  32. Console.WriteLine("myRoute specifies a direction of {0} and a distance of {1}",
  33. myRoute.direction, myRoute.distance);
  34. Console.ReadKey();
  35. }
  36. }
  37. }
示例的说明  结构和枚举一样,也是在代码的主体之外声明的。在名称空间声明 route 结构及其使用的 orientation 枚举:

  1. enum orientation : byte
    {
    north = 1,
    south = 2,
    east = 3,
    west = 4
    }
    struct route
    {
    public orientation direction;
    public double distance;
    }


  代码的主体结构与前面的一些示例类似,要求用户输入一些信息,并显示它们。把方向选择放在 do 循环中,对用户的输入进行有效性的检查,拒绝不属于 1~4 范围的整数输入(选择该范围中的值可以映射到枚举成员,从而方便赋值)。  不能解释为整数的输入会导致一个错误。本章后面会说明其原因和处理方法。  注意 ⚠️,在引用 route 的成员时,处理它们的方式与处理和成员类型相同的变量完全一样。赋值语句如下所示:
  1. myRoute.direction = (orientation)myDirection;
  2. myRoute.distance = myDistance;

  可直接把输入的值放到 myRoute.distance 中,而不会有负面效果,如下所示:

  1. myRoute.distance = Convert.ToDouble(Console.ReadLine());

  还应进行有效性验证,但这段代码不存在这一步骤。对结构成员的任何访问都以相同的方式处理。 <structVar>.<memberVar> 形式的表达式可计算 <memberVar> 类型的变量。