结构
在一个要介绍的变量类型是结构( struct
,structure的缩写 )。结构就是由几个数据组成的数据结构,这些数据可能具有不同的类型。根据这个结构,可以定义自己的变量类型。例如,假定要存储从起点开始到某一位置的路径,其中路径由一个方向和一个距离值(英里)组成。为简单起见,假定该方向是指南针上的一点(这样,方向就可以用上一节的 orientation
枚举来表示),距离值可以用一个 double
类型来表示。
通过前面的代码,可用两个不同的变量来表示该路径:
orientation myDirection;
double myDistance;
像这样使用两个变量,是没有错误的,但在一个地方存储这些信息更加简单(在需要多个路径时,就尤为简单)。
定义结构
使用 struct
关键字来定义结构,如下所示:
struct <typeName>
{
<memberDeclarations>
}
<memberDeclarations>
部分包含变量的声明(称为结构的数据成员),其格式与前面的变量声明一样。每个成员的声明都采用如下形式:
<accessbility> <type> <name>;
要让调用结构的代码访问该结构的数据成员,可以对 <accesssibility>
使用关键字 public
,例如:
struct rout
{
public orientation direction;
public double distance;
}
定义结构类型后,就可以定义该结构类型的变量:
rout myRoute;
还可以通过句点字符访问这个组合变量中的数据成员:
myRoute.direction = orientation.north;
myRoute.distance = 2.5;
把这个类型放在下面的 “试一试”示例中,其中使用上一节的 orientation
枚举和上面的 route
结构。本例在代码中处理这个结构,以便你了解结构的工作原理。
将下列代码添加到 Program.cs
中:
namespace Ch05Ex03
{
enum orientation : byte
{
north = 1,
south = 2,
east = 3,
west = 4
}
struct route
{
public orientation direction;
public double distance;
}
class Program
{
static void Main(string[] args)
{
route myRoute;
int myDirection = -1;
double myDistance;
Console.WriteLine("1) North\n2) South\n3) East\n4) West");
do
{
Console.WriteLine("Select a direction");
myDirection = Convert.ToInt32(Console.ReadLine());
} while ((myDirection < 1) || (myDirection > 4));
Console.WriteLine("Input a distance:");
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();
}
}
}
示例的说明 结构和枚举一样,也是在代码的主体之外声明的。在名称空间声明route
结构及其使用的orientation
枚举:
enum orientation : byte
{
north = 1,
south = 2,
east = 3,
west = 4
}
struct route
{
public orientation direction;
public double distance;
}
代码的主体结构与前面的一些示例类似,要求用户输入一些信息,并显示它们。把方向选择放在do
循环中,对用户的输入进行有效性的检查,拒绝不属于 1~4 范围的整数输入(选择该范围中的值可以映射到枚举成员,从而方便赋值)。 不能解释为整数的输入会导致一个错误。本章后面会说明其原因和处理方法。 注意 ⚠️,在引用route
的成员时,处理它们的方式与处理和成员类型相同的变量完全一样。赋值语句如下所示:
myRoute.direction = (orientation)myDirection;
myRoute.distance = myDistance;
可直接把输入的值放到 myRoute.distance
中,而不会有负面效果,如下所示:
myRoute.distance = Convert.ToDouble(Console.ReadLine());
还应进行有效性验证,但这段代码不存在这一步骤。对结构成员的任何访问都以相同的方式处理。 <structVar>.<memberVar>
形式的表达式可计算 <memberVar>
类型的变量。