C#:枚举,结构体

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}");
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值