C# 学习笔记 - 1.4 - 数据结构

发布时间 2023-08-21 20:26:11作者: Snoopy1866

数据结构

枚举(Enumerations)

枚举是一种数据类型,它通过为一组项中的每一项分配标识符(名称)来枚举它们,同时公开用于对枚举元素进行排序的底层基类型(underlying base type)。默认情况下,底层类型为 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#!");
}

可以为枚举项分配具体值:

enum Age {Infant = 0, Teenager = 13, Adult = 18};

Age myAge = Age.Teenager;
Console.WriteLine("You become a teenager at the age of {0}", (int)myAge);

若未分类具体值,则按照定义枚举项的顺序,从0开始分配连续的整数值。
有时候可能想要创建除了 int 基类型的枚举,可以在枚举名称之后指定任何整数类数据类型(除了 char ),例如:

enum CardSuit : byte {Hearts, Diamonds, Spades, Clubs}

结构体(Structs)

结构体是轻量级对象。它主要用于值类型变量集合只需要一个数据容器的情况。结构体与类的相似之处在于,它们都有构造函数、方法,甚至可以实现接口,但也有重要的区别:

  • 结构体是值类型,而类是引用类型,这意味着他们作为参数被传入函数时的行为不一样
  • 结构体不支持继承,虽然结构体的使用可能受到限制,但如果使用得当,它们所需的内存更少
  • 结构体总是存在构造器(constructor),即使你不使用它。而类允许你通过使用“private”修饰符隐藏构造器

一个结构体的声明如下:

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.birthData = new DataTime(1974, 7, 18);
dana.heightInCm = 178;
dana.weightInKg = 50;

if (dana.birthData < DataTime.Now)
{
    Console.WriteLine("Thank goodness! Dana Developer isn't from the furture!");
}

提供一个构造器可以简化结构体的实例化:

using System;
struct Person
{
    string name;
    DateTime birthData;
    int heightInCm;
    int weightInKg;

    public Person(string name, DateTime birthDate, int heightInCm, int weightInKg)
    {
        this.name = name;
        this.birthDate = birthData;
        this.heightInCm = heightInCm;
        this.weightInKg = weightInKg;
    }
}

public class StructWikiBookSample
{
    public static void Main()
    {
        Person dana = new Person("Dana Developer", new DateTime(1974, 7, 18), 197, 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字节时,结构体的性能表现最好,如果不清楚这一点,请使用类。


数组(Arrays)

数组是同属于相同类型的项目的集合。使用变量或者常量声明数组的长度,数组在声明之后就拥有固定的长度,且无法修改这一长度。

// 一个使用常量定义其长度的数组
int[] integers = new int[20];

int length = 0;
System.Console.Write("How long should the array be? ");
length = int.Parse(System.Console.ReadLine());
// 一个使用变量定义其长度的数组
// 这个数组在声明之后仍然无法改变其长度
double[] doubles = new double[length];