枚举是定义一组命名常量的值类型,用于表示有限且互斥的选项(如状态码、类型分类)。默认基础类型为 int,可显式指定为其他整数类型(byte, long 等)。//未指定数据类型,默认为intpublic enum Season { Spring, // 默认值 0 Summer, // 默认值 1 Autumn = 2, // 显式赋值 Winter // 自动递增为 3}// 指定枚举的基础类型为 shortenum Week : short{ Monday = 1, Tuesday, // 自动赋值为2 Wednesday, // 自动赋值为3 Thursday, Friday, Saturday, Sunday}
- 1、首成员未赋值时默认为 0,后续成员依次递增 1。2、重要限制:枚举变量未初始化时默认值为 0(即使未定义值为 0 的成员)。
int value = (int)Season.Summer; // 1Season season = (Season)2; // Autumn
string name = Season.Spring.ToString(); // "Spring"Season parsed;bool success = Enum.TryParse("Winter", out parsed); // true
结构体 是一种自定义变量类型 类似枚举需要自己定义
它是 数据和函数 的集合 可以声明各种变量和方法
结构体 可以让单一的变量存储多个数据(值类型)
用法和形式和 类基本相同,可以存储字段,属性,方法,可以理解为:结构体 是值类型的 对象
作用:用来表现存在关系的数据集合 比如用结构体表现学生 动物 人等
2、基本语法
结构体的使用分为两步:1.结构体声明 2.结构体的创建
1.结构体的声明(类似于类的声明)
结构体一般写在namespace 语句中 关键字struct
格式: struct 结构体的名字(帕斯卡命名法)
{
结构体成员(
第二部分:构造函数(可选)
第三部分:函数(也可选) )
}
第一部分:变量
结构体声明的变量 不能直接初始化 只能在外部或者函数中初始化
变量类型 可以写任意类型 包括结构体 但是不能写自己的结构体
Student s;不能是自己的结构体
struct Student{ //年龄 public int age; //性别 public bool sex; //学号 public int number; //姓名 public string name; }
第二部分:构造函数(可选)
1.没有返回值 可以重载
2.函数名必须和结构体名相同
3.必须有参数
4.如果声明了构造函数 那么必须在其中对所有变量数据初始化
作用:帮助我们快速初始化结构对象的
构造函数 一般是用于在外部方便初始化的
publicStudent(int age, bool sex, int number, string name) { //新的关键字 this //代表自己 this.age=age; this.sex =sex; this.number = number; this.name = name; }
第三部分:函数(也可选)
表现这个数据结构的行为
注意 在结构体中的方法 目前不需要加static关键字
publicvoidSpeak() { //函数中可以直接使用结构体内部声明的变量 Console.WriteLine("我的名字{0},我今年{1}岁", name, age); }
访问修饰符相关:
internal class Program { staticvoidMain(string[] args) { 知识点四 结构体的使用 //2.结构体的创建 变量类型 变量名; Student s1; s1.age = 10; s1.sex = true; s1.name = "张"; s1.number = 1; s1.Speak(); Student s2 = new Student(18, true, 2, "小红"); s2.Speak(); } }
1.结构体是值类型,类是引用类型
2.结构体存在栈中,类存在堆中
3.结构体成员不能使用protected访问修饰符,而类可以
4.结构体成员变量声明不能指定初始值,而类可以
5.结构体不能申明无参的构造函数,而类可以
6.结构体声明有参构造函数后,无参构造不会被顶掉
7.结构体不能申明析构函数,而类可以
8.结构体不能被继承,而类可以
9.结构体需要在构造函数中初始化所有成员变量,而类随意
10.结构体不能被静态static修饰(不存在静态结构体),而类可以
11.结构体不能在自己内部申明和自已一样的结构体变量,而类可以
如何选择结构体和类
1.想要用继承和多态时,直接淘汰结构体,比如玩家、怪物等等
2.对象是数据集合时,优先考虑结构体,比如位置、坐标等等
3.从值类型和引用类型赋值时的区别上去考虑,比如经常被赋值传递的对象,并且改变赋值对象,原对象不想跟着变化时,就用结构体。比如坐标、向量、旋转等等