• 回复@大雨582:社会人不可能像自然人一样自由,你还得尊重别人的意愿!不然咱随便生产啥都强行让你要,咱是自由了,你呢? 2019-10-12
  • 发改委每月首个工作日公布限制乘坐火车飞机人员名单 2019-10-12
  • 全国啦啦操联赛临汾站开幕 2019-10-08
  • 《爱疯音乐家》陈洁仪:不完美的美其实更美爱疯音乐家陈洁仪 2019-10-08
  • 中冶置业兴隆百万平米新城正式亮相 将打造全配套高铁康养小镇 2019-10-06
  • 以政府拟严打“乱拍摄”以军行为 最高10年监禁 2019-10-03
  • 图解:关于中国梦,习近平总书记这十句话直抵人心 2019-09-20
  • “舌尖”之后, “风味”能否再续辉煌? 2019-09-17
  • 腾讯要花32亿收购《绝地求生》开发商10%股份 2019-09-17
  • 涨知识!文字里的秘密 最全甲骨文书展来了 2019-09-13
  • 晋中市着力将“厕所革命”进行到底 2019-09-05
  • 供应链如何更“智慧” 2019-09-05
  • 红枣食疗效果好 6种吃法最滋补-美食资讯 2019-09-01
  • 党的十九大最重大的理论成就 2019-08-28
  • 余世存:阅读经典不仅是消费,也是责任 2019-08-20
  • 广东风采36选7开奖结果: DevTips Unity C#编程优化——枚举

    152
    回复
    23770
    查看
    打印 上一主题 下一主题
      [ 复制链接 ]
    排名
    9778
    昨日变化

    福建36选7和值走势图 www.00-na.com 263

    主题

    301

    帖子

    1602

    积分

    Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

    UID
    159865
    好友
    9
    蛮牛币
    3981
    威望
    0
    注册时间
    2016-8-1
    在线时间
    626 小时
    最后登录
    2018-3-8

    蛮牛译员

    马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

    您需要 登录 才可以下载或查看,没有帐号?注册帐号

    x
    Unity C#编程优化——枚举

    我讨厌C#的枚举类型。我都会尽量避免它??悸窍旅婀赜谛行敲毒俚恼飧隼樱?/font>

    [C#] 纯文本查看 复制代码
    public enum Planet {
        MERCURY,
        VENUS,
        EARTH,
        MARS,
        JUPITER,
        SATURN,
        URANUS,
        NEPTUNE,
        PLUTO // Pluto is a planet!!!
    }


    起初,这样的定义还算好,直到需要产生一个行星的质量。所以我们做这样的事情:

    [C#] 纯文本查看 复制代码
    // Returns the mass of the planet in 10^24 kg
    public float GetMass(Planet planet) {
        switch(planet) {
            case Planet.MERCURY:
                return 0.330;
            case Planet.VENUS:
                return 4.87f;
            case Planet.EARTH:
                return 5.97f;
            ...
            case Planet.PLUTO:
                return 0.0146f;
        }
    }


    行星直径又如何? 另一个switch语句? 密度怎么样? 重力? 逃跑速度? 只要想想你将要维护的switch语句的数量。 你可以争辩说,你可以使用一个Dictionary,但仍然笨重。 每个数据的Dictionary都要映射?没门。

    有一个更好的方法,我会告诉你如何。 这可能已经是非Unity程序员的常识,但我想在我的博客中再次提出这个冗余的主题,对于那些可能不知道这一点的人来说,特别是初学者。 我也想保持简单。

    基本上,你可以使用类作为枚举。 为什么用类? 这确实表现的更好 您可以存储任意数量的任意数据。 您甚至可以存储例程或功能。 你可以做很多事情。 唯一的要求是它是不可变的,这意味着类一个实例的状态在整个程序期间都不能改变。以下是Planet枚举用类表示的一个版本:


       
    [C#] 纯文本查看 复制代码
     public class Planet {
            // The different values
            public static readonly Planet MERCURY = new Planet(0, 0.330f, 4879, 5427, 3.7f);
            public static readonly Planet VENUS = new Planet(1, 4.87f, 12104, 5243, 8.9f);
            public static readonly Planet EARTH = new Planet(2, 5.97f, 12756, 5514, 9.8f);
            public static readonly Planet MARS = new Planet(3, 0.642f, 6792, 3933, 3.7f);
            public static readonly Planet JUPITER = new Planet(4, 1898.0f, 142984, 1326, 23.1f);
            public static readonly Planet SATURN = new Planet(5, 568.0f, 120536, 687, 9.0f);
            public static readonly Planet URANUS = new Planet(6, 86.8f, 51118, 1271, 8.7f);
            public static readonly Planet NEPTUNE = new Planet(7, 102.0f, 49528, 1638, 11.0f);
            public static readonly Planet PLUTO = new Planet(8, 0.0146f, 2370, 2095, 0.7f);
            // Use readonly to maintain immutability
            private readonly int id;
            private readonly float mass; // in 10^24 kg
            private readonly int diameter; // in km
            private readonly int density; // in kg/m^3
            private readonly float gravity; // in m/s^2
            // We use a private constructor because this should not be instantiated
            // anywhere else.
            private Planet(int id, float mass, int diameter, int density, float gravity) {
                this.id = id;
                this.mass = mass;
                this.diameter = diameter;
                this.density = density;
                this.gravity = gravity;
            }
            public int Id {
                get {
                    return id;
                }
            }
            public float Mass {
                get {
                    return mass;
                }
            }
            public int Diameter {
                get {
                    return diameter;
                }
            }
            public int Density {
                get {
                    return density;
                }
            }
            public float Gravity {
                get {
                    return gravity;
                }
            }
        }


    为了保持不变性,所有成员变量应该是只读的。 一旦他们被分配,他们将不能再被改变。 这很重要,因为作为枚举,它的内部值不应该改变。 然后将每个枚举值实现为该类的静态只读实例。

    这是怎么用的? 与正常枚举是一样的,如下使用:


    [C#] 纯文本查看 复制代码
    // Use it like an enum
    ship.TargetPlanet = Planet.NEPTUNE;
    // Want to know the target planet's mass?
    float mass = ship.TargetPlanet.Mass;
    // Density?
    int density = ship.TargetPlanet.Density;



    我们已经消除了切换语句或字典来维护不同行星信息的需要。 想要一个新的行星状态? 只需添加一个新的成员变量并在实例化上指定它们。

    如何从其他数据类型转换? 喜欢说从int id转换为Planet实例? 这很容易 通常我为这些转换添加了一个公共和静态方法。 例如:


    [C#] 纯文本查看 复制代码
    public class Planet {
        // The different values
        public static readonly Planet MERCURY = new Planet(0, 0.330f, 4879, 5427, 3.7f);
        public static readonly Planet VENUS = new Planet(1, 4.87f, 12104, 5243, 8.9f);
        public static readonly Planet EARTH = new Planet(2, 5.97f, 12756, 5514, 9.8f);
        public static readonly Planet MARS = new Planet(3, 0.642f, 6792, 3933, 3.7f);
        public static readonly Planet JUPITER = new Planet(4, 1898.0f, 142984, 1326, 23.1f);
        public static readonly Planet SATURN = new Planet(5, 568.0f, 120536, 687, 9.0f);
        public static readonly Planet URANUS = new Planet(6, 86.8f, 51118, 1271, 8.7f);
        public static readonly Planet NEPTUNE = new Planet(7, 102.0f, 49528, 1638, 11.0f);
        public static readonly Planet PLUTO = new Planet(8, 0.0146f, 2370, 2095, 0.7f);
        // This can be used to loop through all planets
        public static Planet[] ALL = new Planet[] {
            MERCURY, VENUS, EARTH, MARS, JUPITER, SATURN, URANUS, NEPTUNE, PLUTO
        };
        // Converts the specified id to a Planet instance
        public static Planet Convert(int id) {
            for(int i = 0; i < ALL.Length; ++i) {
                if(ALL.Id == id) {
                    return ALL;
                }
            }
            // return ALL[id] could also work here but what if a non sequential id is used?
            throw new Exception("Cannot convert {0} to a Planet.".FormatWith(id));
        }
        ...
    }
    // Usage
    Planet planet = Planet.Convert(someIntPlanet);


    想从字符串ID转换? 添加将保存此值的字符串成员变量。 而不是使用诸如ALL []的数组,您可以使用如下所示的Dictionary:
    [C#] 纯文本查看 复制代码
    private static Dictionary<string, Planet> ALL = new Dictionary<string, Planet>() {
        { MERCURY.TextId, MERCURY },
        { VENUS.TextId, VENUS },
        { EARTH.TextId, EARTH },
        ...
        { PLUTO.TextId, PLUTO },
    };
    // Converts the specified string to a Planet instance
    public static Planet Convert(string id) {
        return ALL[id];
    }


    您可以支持您喜欢的任何类型的转换。
    还有更多的你可以做。 您现在可以添加功能。 你可以这样做:

    [C#] 纯文本查看 复制代码
    Planet currentPlanet = Planet.VENUS;
    currentPlanet.ApplyGravity(ship);
    The coolest thing for me is you can specify different actions or behavior to the enum values. Something like this (It’s very contrived but you get the idea.):
    public static readonly Planet EARTH = new Planet(2, 5.97f, 12756, 5514, 9.8f, delegate(Ship ship) {
        // Actions on land of ship
        ship.AddFood(1000);
        ship.RetireCrew();
        ship.RecruitNewCrew();
    });
    public static readonly Planet MARS = new Planet(3, 0.642f, 6792, 3933, 3.7f, delegate(Ship ship) {
        // Actions on land of ship
        ship.DeductFood(50);
        ship.Research();
        ship.Mine();
    });


    通过简单地将你的枚举变成一个类,你已经将它升级到更有组织的东西,而且更加功能强大。 您也可以使用反射和继承等先进功能,但大多数情况下,您不需要。
    希望这可以帮助你。








    原文标题:Better C# Enums
    原文链接:https://coffeebraingames.wordpress.com/2017/10/08/better-c-enums/

    点评

    很有用,多谢了!  发表于 2018-10-30 09:13
    参与人数 1鲜花 +2 收起 理由
    xinansky + 2

    查看全部评分总评分 : 鲜花 +2

    本帖被以下淘专辑推荐:

    2初来乍到
    142/150
    排名
    31434
    昨日变化

    0

    主题

    46

    帖子

    142

    积分

    Rank: 2Rank: 2

    UID
    34263
    好友
    0
    蛮牛币
    9
    威望
    0
    注册时间
    2014-7-14
    在线时间
    86 小时
    最后登录
    2019-7-30
    151#
    2019-6-15 19:00:14 只看该作者
    可以学习学习哈哈
    6蛮牛粉丝
    1409/1500
    排名
    2867
    昨日变化

    12

    主题

    306

    帖子

    1409

    积分

    Rank: 6Rank: 6Rank: 6

    UID
    196727
    好友
    0
    蛮牛币
    1889
    威望
    0
    注册时间
    2016-12-28
    在线时间
    567 小时
    最后登录
    2019-10-21
    150#
    2019-3-4 10:42:59 只看该作者
    1.枚举与类的定位是不同的。
    2.这完全不是优化;只是创建个类就算作优化的话,那岂不是我们天天都在做优化?
    3.我想到的一个优化方案:创建一个星球的基类,然后每个星球就是一个类,之后无论怎么扩展都可以,其中呢个枚举类型,可以作为星球类的一个只读属性,这样才能提高可读性、可复用性、可扩展性
    排名
    64937
    昨日变化

    0

    主题

    6

    帖子

    31

    积分

    Rank: 1

    UID
    314555
    好友
    0
    蛮牛币
    30
    威望
    0
    注册时间
    2019-2-22
    在线时间
    23 小时
    最后登录
    2019-7-30
    149#
    2019-2-25 18:02:09 只看该作者
    这种情况不适合用枚举
    排名
    64937
    昨日变化

    0

    主题

    36

    帖子

    41

    积分

    Rank: 1

    UID
    311706
    好友
    0
    蛮牛币
    3
    威望
    0
    注册时间
    2019-1-14
    在线时间
    3 小时
    最后登录
    2019-2-28
    148#
    2019-2-19 15:24:50 只看该作者
    还可以,做游戏用枚举特别多,学习学习
    2初来乍到
    107/150
    排名
    13056
    昨日变化
    1

    0

    主题

    18

    帖子

    107

    积分

    Rank: 2Rank: 2

    UID
    221609
    好友
    0
    蛮牛币
    167
    威望
    0
    注册时间
    2017-5-11
    在线时间
    21 小时
    最后登录
    2019-2-15
    147#
    2019-2-15 17:27:12 只看该作者
    搞不懂啊啊啊啊啊啊啊啊
    6蛮牛粉丝
    1209/1500
    排名
    1655
    昨日变化

    1

    主题

    95

    帖子

    1209

    积分

    Rank: 6Rank: 6Rank: 6

    UID
    69019
    好友
    1
    蛮牛币
    1849
    威望
    0
    注册时间
    2015-1-16
    在线时间
    331 小时
    最后登录
    2019-10-15
    146#
    2019-2-14 10:48:41 只看该作者
    不错的一个小优化
    排名
    39864
    昨日变化

    0

    主题

    4

    帖子

    12

    积分

    Rank: 1

    UID
    313044
    好友
    0
    蛮牛币
    3
    威望
    0
    注册时间
    2019-1-28
    在线时间
    2 小时
    最后登录
    2019-1-30
    145#
    2019-1-30 10:10:33 只看该作者
    这种就是一个普通的工厂模式而已
    5熟悉之中
    697/1000

    0

    主题

    493

    帖子

    697

    积分

    Rank: 5Rank: 5

    UID
    109564
    好友
    0
    蛮牛币
    5
    威望
    0
    注册时间
    2015-6-20
    在线时间
    204 小时
    最后登录
    2019-9-18
    144#
    2019-1-3 10:25:15 只看该作者
    6666666666666666666666666
    3偶尔光临
    194/300
    排名
    13986
    昨日变化

    1

    主题

    64

    帖子

    194

    积分

    Rank: 3Rank: 3Rank: 3

    UID
    130475
    好友
    0
    蛮牛币
    285
    威望
    0
    注册时间
    2015-12-1
    在线时间
    69 小时
    最后登录
    2019-7-15
    143#
    2018-12-29 16:13:18 只看该作者
    3偶尔光临
    194/300
    排名
    13986
    昨日变化

    1

    主题

    64

    帖子

    194

    积分

    Rank: 3Rank: 3Rank: 3

    UID
    130475
    好友
    0
    蛮牛币
    285
    威望
    0
    注册时间
    2015-12-1
    在线时间
    69 小时
    最后登录
    2019-7-15
    142#
    2018-12-21 12:37:43 只看该作者
    很不错的资源~~~
    7日久生情
    2411/5000
    排名
    1387
    昨日变化

    0

    主题

    743

    帖子

    2411

    积分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    135463
    好友
    0
    蛮牛币
    188
    威望
    0
    注册时间
    2016-1-23
    在线时间
    776 小时
    最后登录
    2019-10-21
    141#
    2018-12-14 11:36:32 只看该作者
    6666666666666666666666666666
    排名
    21330
    昨日变化

    0

    主题

    10

    帖子

    49

    积分

    Rank: 1

    UID
    227628
    好友
    0
    蛮牛币
    53
    威望
    0
    注册时间
    2017-6-21
    在线时间
    15 小时
    最后登录
    2019-2-28
    140#
    2018-12-3 16:57:32 只看该作者
    学到了学到了
    4四处流浪
    457/500
    排名
    6050
    昨日变化

    5

    主题

    72

    帖子

    457

    积分

    Rank: 4

    UID
    298405
    好友
    3
    蛮牛币
    1774
    威望
    0
    注册时间
    2018-9-27
    在线时间
    152 小时
    最后登录
    2019-4-19
    139#
    2018-11-27 09:51:53 只看该作者
    {:107:}{:107:}{:107:}{:107:}
    排名
    13056
    昨日变化
    1

    0

    主题

    6

    帖子

    98

    积分

    Rank: 2Rank: 2

    UID
    299622
    好友
    0
    蛮牛币
    203
    威望
    0
    注册时间
    2018-10-11
    在线时间
    26 小时
    最后登录
    2019-1-25
    138#
    2018-11-19 15:29:45 只看该作者
    程序萌新,原文没看懂,评论区倒是精彩
    排名
    31434
    昨日变化

    0

    主题

    17

    帖子

    31

    积分

    Rank: 1

    UID
    301195
    好友
    0
    蛮牛币
    119
    威望
    0
    注册时间
    2018-10-24
    在线时间
    4 小时
    最后登录
    2018-11-22
    137#
    2018-11-16 11:23:17 只看该作者
    666
    您需要登录后才可以回帖 登录 | 注册帐号

    本版积分规则

  • 回复@大雨582:社会人不可能像自然人一样自由,你还得尊重别人的意愿!不然咱随便生产啥都强行让你要,咱是自由了,你呢? 2019-10-12
  • 发改委每月首个工作日公布限制乘坐火车飞机人员名单 2019-10-12
  • 全国啦啦操联赛临汾站开幕 2019-10-08
  • 《爱疯音乐家》陈洁仪:不完美的美其实更美爱疯音乐家陈洁仪 2019-10-08
  • 中冶置业兴隆百万平米新城正式亮相 将打造全配套高铁康养小镇 2019-10-06
  • 以政府拟严打“乱拍摄”以军行为 最高10年监禁 2019-10-03
  • 图解:关于中国梦,习近平总书记这十句话直抵人心 2019-09-20
  • “舌尖”之后, “风味”能否再续辉煌? 2019-09-17
  • 腾讯要花32亿收购《绝地求生》开发商10%股份 2019-09-17
  • 涨知识!文字里的秘密 最全甲骨文书展来了 2019-09-13
  • 晋中市着力将“厕所革命”进行到底 2019-09-05
  • 供应链如何更“智慧” 2019-09-05
  • 红枣食疗效果好 6种吃法最滋补-美食资讯 2019-09-01
  • 党的十九大最重大的理论成就 2019-08-28
  • 余世存:阅读经典不仅是消费,也是责任 2019-08-20
  • 彩票网 澳洲5分彩官方开奖结果 90比分即时足球比分 bwf羽毛球 恒博国际娱乐苹果版下载 红黑大战稳赢技巧 排球英文术语 一位杀号 河南福彩快三最大遗漏 11选5有什么技巧 体育彩票3d走势图带线 吉林走势表走势图 赌博怎样才能赢 网络捕鱼天天输 注册送38元网址