C# 编程/数据结构
在 C# 中,有许多方法可以将数据集合组合在一起。
枚举 是一种数据类型,它通过为每个项目分配一个标识符(名称)来枚举一组项目,同时公开一个底层基本类型以对枚举元素进行排序。默认情况下,底层类型为 int
,但可以是除了 char
之外的任何整数类型。
枚举的声明如下
enum Weekday { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday };
然后,上述枚举中的元素可作为常量使用
Weekday day = Weekday.Monday;
if (day == Weekday.Tuesday)
{
Console.WriteLine("Time sure flies by when you program in C#!");
}
如果如上例所示未为枚举项分配显式值,则第一个元素的值为 0,并且每个后续元素都被分配后续值。但是,可以将底层整数类型中的特定值分配给任何枚举元素(请注意,为了访问基本类型,变量必须进行类型转换)。
enum Age { Infant = 0, Teenager = 13, Adult = 18 };
Age myAge = Age.Teenager;
Console.WriteLine("You become a teenager at an age of {0}.", (int)myAge);
当枚举的用途仅仅是将一组项目组合在一起时(例如,以比整数更有意义的方式表示国家、州或地理区域),枚举元素的底层值可能不会被使用。与其定义一组逻辑相关的常量,不如使用枚举更具可读性。
可能需要创建一个基本类型不是 int
的枚举。为此,请指定除了 char
之外的任何整数类型,并使用基类扩展语法在枚举名称之后,如下所示
enum CardSuit : byte { Hearts, Diamonds, Spades, Clubs };
如果需要输出值,枚举类型也很有用。通过调用枚举上的 .ToString()
方法,将输出枚举名称(例如,CardSuit.Hearts.ToString()
将输出“Hearts”)。
结构体(关键字 struct)是轻量级对象。它们主要用于仅需要值类型变量集合的数据容器时。结构体与类类似,它们可以具有构造函数、方法,甚至可以实现接口,但存在重要的区别。
- 结构体是值类型,而类是引用类型,这意味着它们在作为参数传递给方法时表现不同。
- 结构体不支持继承。虽然结构体在使用上似乎有限制,但如果以正确的方式使用,它们需要更少的内存并且成本更低。
- 结构体始终具有默认构造函数,即使您不想要一个。类允许您使用“private”修饰符隐藏构造函数,而结构体必须具有一个。
例如,可以这样声明一个 struct
struct Person
{
public string name;
public System.DateTime birthDate;
public int heightInCm;
public int weightInKg;
}
然后,可以这样使用 Person
结构体
Person dana = new Person();
dana.name = "Dana Developer";
dana.birthDate = new DateTime(1974, 7, 18);
dana.heightInCm = 178;
dana.weightInKg = 50;
if (dana.birthDate < DateTime.Now)
{
Console.WriteLine("Thank goodness! Dana Developer isn't from the future!");
}
也可以为 struct
提供构造函数,以简化初始化过程
using System;
struct Person
{
string name;
DateTime birthDate;
int heightInCm;
int weightInKg;
public Person(string name, DateTime birthDate, int heightInCm, int weightInKg)
{
this.name = name;
this.birthDate = birthDate;
this.heightInCm = heightInCm;
this.weightInKg = weightInKg;
}
}
public class StructWikiBookSample
{
public static void Main()
{
Person dana = new Person("Dana Developer", new DateTime(1974, 7, 18), 178, 50);
}
}
还有一种用于初始化结构体的替代语法
struct Person
{
public string Name;
public int Height;
public string Occupation;
}
public class StructWikiBookSample2
{
public static void Main()
{
Person john = new Person { Name = "John", Height = 182, Occupation = "Programmer" };
}
}
结构体实际上仅出于性能原因使用,或者如果您打算按值引用它们。当结构体保存的数据总量等于或小于 16 字节时,结构体效果最佳。如果有疑问,请使用类。
数组表示一组属于相同类型的项目。声明本身可以使用变量或常量来定义数组的长度。但是,数组具有固定长度,并且在声明后无法更改。
// an array whose length is defined with a constant
int[] integers = new int[20];
int length = 0;
System.Console.Write("How long should the array be? ");
length = int.Parse(System.Console.ReadLine());
// an array whose length is defined with a variable
// this array still can't change length after declaration
double[] doubles = new double[length];