1、枚举
枚举定义在命名空间下面,相当于定义了一个数据类型(整数类型)
关键字 enum
定义一个枚举
enum WeekDays
{
Monday,
Tuesday,
Wednesday,
Friday,
Saturday,
Sunday
}
枚举值:如果未将值分配给枚举成员,则编译器将在默认情况下为每个成员分配整数值(从零开始)。枚举的第一个成员将为0,并且每个连续枚举成员的值将增加1。
enum WeekDays
{
Monday, //0
Tuesday, //1
Wednesday, //2
Thursday, //3
Friday, //4
Saturday, //5
Sunday //6
}
可以为枚举成员分配不同的值。枚举成员的默认值的更改将自动按顺序向其他成员分配增量值。
enum WeekDays
{
Monday, //0
Tuesday, //1
Wednesday, //2
Thursday=10, //10
Friday, //11
Saturday, //12
Sunday //13
}
枚举可以是任何数字数据类型,例如 byte,sbyte,short,ushort,int,uint,long 或 ulong。但是,枚举不能为字符串类型。
在 enum 名称后指定类型为:long
enum WeekDays:long
{
Monday, //0
Tuesday, //1
Wednesday=23, //23
Thursday=10, //10
Friday, //11
Saturday, //12
Sunday //13
}
访问:枚举名.值
2、结构体
关键字:struct
值类型
struct Player
{
public string name;
public int atk;
public int def;
public int hp;
public Player(string name,int atk,int def,int hp)
{
this.name = name;
this.atk = atk;
this.def = def;
this.hp = hp;
}
)重点:
结构体是值类型数据,当一个结构体变量作为函数参数传递时, 属于值类型的值传递,也就是传入的是一个副本,函数体内对结构体的改变,不会影响方法体外的结构体变量。如果想要改变,可以使用ref 或者out 进行值类型的引用传递,这样,传入的参数就是结构体本身,当方法体内改变了结构体变量也就是改变了方法体外的结构体变量。
)结构体和类的区别
(1)结构体是值类型 类是引用类型
(2)结构体也有构造方法,不仅有默认无参构造方法而且不能被覆盖,但是你可以定义有参数的构造方法
如果你定义了有参的构造方法必须在这里给你所有的字段赋初值。this在这结构体用法与类中一样
(3)在结构体中不可以直接给字段赋值的,但是类中可以。
(4)结构体在定义变量的时候,可以用new也可以不用,如果用new了那么其实表明你要调用结构体的构造方法
(5)结构体没有析构方法但是类有
(6)结构体中一样有字段、属性、索引器、方法、事件。但是结构体不能继承结构体和类,但是可以继承接口,但是类可以继承类和接口,但是也不能继承结构体
)使用场景
1、当堆栈的空间很有限,且有大量的逻辑对象时,创建类要比创建结构好一些;
2、对于点、矩形和颜色这样的轻量对象,假如要声明一个长度为10000的point 数组,则CLR需要为每个对象分配内存,在这种情况下,使用结构的成本较低;
3、在表现抽象和多级别的对象层次时,类是最好的选择,因为结构不支持继承。
4、大多数情况下,目标类型只是含有一些数据,或者以数据为主。
internal class Program
{
static void Main(string[] args)
{
Player player = new Player("玩家",52,12,100);
Boss boss = new Boss("Boss",50,50,500);
while (true)
{
player.Atk(ref boss); //玩家攻击 需要加ref修饰,因为struct是值传递
if (boss.hp<0)
{
Console.WriteLine("Boss死亡");
break;
}
boss.Atk(ref player);
if (player.hp<0)
{
Console.WriteLine("玩家死亡");
break;
}
}
Console.ReadKey();
}
}
struct Player
{
public string name;
public int atk;
public int def;
public int hp;
public Player(string name,int atk,int def,int hp)
{
this.name = name;
this.atk = atk;
this.def = def;
this.hp = hp;
}
public void Atk(ref Boss boss) //玩家攻击
{
boss.hp = boss.hp - (this.atk-boss.def); //Boss血量
Console.WriteLine($"{this.name}对{boss.name}造成{this.atk - boss.def}点伤害,{boss.name}的剩余血量是{boss.hp}");
}
}
struct Boss
{
public string name;
public int atk;
public int def;
public int hp;
public Boss(string name, int atk, int def, int hp)
{
this.name = name;
this.atk = atk;
this.def = def;
this.hp = hp;
}
public void Atk(ref Player play) //Boss攻击
{
play.hp = play.hp - (this.atk - play.def); //玩家血量
Console.WriteLine($"{this.name}对{play.name}造成{this.atk - play.def}点伤害,{play.name}的剩余血量是{play.hp}");
}
}