『好好学习,天天向上。』—— 毛主席语录
今天继续学习《C#入门经典》的第五章第二节。
复杂的变量类型
除了简单的变量类型,C#还提供了3个比较复杂的变量:枚举、结构和数组。
枚举
定义一个类型,其取值范围是用户提供的值的有限集合。
注意有一个附加步骤——不是仅声明一个给定类型的变量,而是声明和描述一个用户定义的类型,再声明这个新类型的变量。
定义枚举
语法:访问修饰符enum枚举名{值1,值2…}
1、枚举是一组描述性的名称
2、枚举定义一组有限的值,不能包含方法
3、对可能的值进行约束
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>的值是0,等等。可以重写这个赋值过程:使用=运算符,指定每个枚举的实际值:
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。
练一练:枚举的使用
(1)将以下代码添加到Program.cs中:
using System;
namespace L013_ConsoleApp10
{
enum orientation:byte
{
north=1,south=2,east=3,west=4
}
class Program
{
static void Main(string[]args)
{
orientation myDirection = orientation.north;
Console.WriteLine($"myDirection={myDirection}");
Console.ReadKey();
}
}
}
(2)运行程序,结果如下图:
(3)退出应用程序,修改代码,如下所示:
using System;
namespace L013_ConsoleApp10
{
enum orientation:byte
{
north=1,south=2,east=3,west=4
}
class Program
{
static void Main(string[]args)
{
byte directionByte;
string directionString;
orientation myDirection = orientation.north;
Console.WriteLine($"myDirection={myDirection}");
directionByte = (byte)myDirection;
directionString = Convert.ToString(myDirection);
Console.WriteLine($"byteequivalebt={directionByte}");
Console.WriteLine($"stringequivalebt={directionString}");
Console.ReadKey();
}
}
}
(4)再次运行应用程序,输出如下图:
结构
结构就是由几个数据组成的数据结构,这些数据可能具有不同的类型。
定义结构
使用struct关键字定义结构,如下所示:
struct
{
}
部分包含变量的声明(称为结构的数据成员),其格式与前面的变量声明一样。其格式与前面的声明一样。每个成员的声明都采用如下形式:
;
要让调用结构的代码访问该结构的数据成员,可以对使用关键字public。
数组
数组是一个变量的索引列表,存储在数组类型的变量中。
1、声明数组
语法结构:
[];
其中,可以是任何变量类型,包括枚举和结构。数组必须在访问之前初始化,不能像下面这样访问数组或给数组元素赋值:
int[]myIntArray;
myIntArray[10]=5;
数组的初始化有两种方式。可以字面值形式指定数组的完整内容,也可以指定数组的大小,再使用关键字new初始化所有数组元素。
要使用字面值指定数组,只需要提供一个用逗号分隔的元素值列表,该列表放在花括号中,例如:
int[]myIntArray={6,9,10,2,99};
其中myIntArray有5个元素,每个元素都被赋予一个整数值。
另一种方式需要使用下述语法:
int[]myIntArray=new int[5];
这里使用关键字new显示地初始化数组,用一个常量值定义其大小。这种方式会给所有数组元素赋予同一个默认值,对于数值类型来说,其默认值是0。也可以使用非常量的变量来进行初始化,例如:
int[]myIntArray=new int[arraySize];
还可以组合使用这两种初始化方式:
int[]myIntArray=new int[5]{6,9,10,2,99};
使用这种方式,数组大小必须与元素个数相匹配。
如果使用变量定义其大小,该变量必须是一个常量,例如:
const int arraySize=5;
int[]myIntArray=new int[arraySize]{6,9,10,2,99};
如果省略了关键字const,运行这段代码就会失败。
练一练:使用数组
(1)将以下代码添加到Program.cs中:
using System;
namespace L014_ConsoleApp11
{
class Program
{
static void Main(string[] args)
{
string[] friendNames = { "Todd Alei", "Kevin Alei", "Shane Alei" };
int i;
Console.WriteLine($"Here are {friendNames.Length}of my friends:");
for (i=0;i<friendNames.Length;i++)
{
Console.WriteLine(friendNames[i]);
}
Console.ReadKey();
}
}
}
(2)执行代码,结果如下:
示例说明
这段代码用3个值建立了一个string数组,并在for循环中把它们列在控制台上。使用friendName.Length来确定数组中的元素个数:
Console.WriteLine($“Here are {friendNames.Length}of my friends:”);
这是获取数组大小的简便方法。
2、foreach循环
foreach循环可以使用一种简便的语法来定位数组中的每个元素:
foreach(<baseType><name>in <array>)
{
//can use<name>for each element
}
这个循环会迭代每个元素,依次把每个元素放在变量中,且不存在访问非法元素的危险。不需要考虑数组中有多少个元素,并可以确保将在循环中使用每个元素。
foreach循环和标准的for循环的主要区别在于:foreach循环对数组内容进行只读访问,所以不能改变任何元素的值。使用简单的for循环,就可以给数组元素赋值。
3、多维数组
多维数组是使用多个索引访问其元素的数组。
二维数组可以声明如下:
<baseType>[,]<name>;
多维数组只需要更多逗号,例如:
<baseType>[,,,]<name>;
该语句声明了一个4维数组。赋值也使用类似的语法,用逗号分隔大小。
4、数组的数组
声明数组的数组时,其语法要求在数组声明中指定多个方括号对:
int[][]jaggedIntArray
齿轮数组的语法太复杂了,没仔细看,以后有需要再详细看吧。/捂脸/捂脸