跳转到内容

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];
华夏公益教科书