Java VS中的枚举C#中的枚举

乔·卡兰戈:

我有一个非常基本的问题。在Java中,可以将属性和变量指向Enums,例如:

public enum DayTime{
    Morning("Morning"),
    Afternoon("Afternoon"),
    Night("Night");

    private string description;

    Daytime(string description){
        this.description = description;
    }

    public string getDescription(){
        return description;
    }
}

是否可以将相同的概念应用于C#?我正在尝试对产品进行模块化描述,而它们的名称,内容和特征将显示在文本字符串中,而Enums似乎是根据选择的特征修改此文本的最佳选择。

戴夫·多肯尼斯

与Java枚举相比,C#枚举非常基础。如果要模拟相同的行为,则需要使用带有内部枚举的类:

using System.Collections.Generic;

public sealed class DayTime
{
    public static readonly DayTime Morning = new DayTime("Morning", InnerEnum.Morning);
    public static readonly DayTime Afternoon = new DayTime("Afternoon", InnerEnum.Afternoon);
    public static readonly DayTime Night = new DayTime("Night", InnerEnum.Night);

    private static readonly List<DayTime> valueList = new List<DayTime>();

    static DayTime()
    {
        valueList.Add(Morning);
        valueList.Add(Afternoon);
        valueList.Add(Night);
    }

    //the inner enum needs to be public for use in 'switch' blocks:
    public enum InnerEnum
    {
        Morning,
        Afternoon,
        Night
    }

    public readonly InnerEnum innerEnumValue;
    private readonly string nameValue;
    private readonly int ordinalValue;
    private static int nextOrdinal = 0;

    private string description;

    internal DayTime(string name, InnerEnum innerEnum)
    {
        this.description = name;

        nameValue = name;
        ordinalValue = nextOrdinal++;
        innerEnumValue = innerEnum;
    }

    public string Description
    {
        get
        {
            return description;
        }
    }

    //the following methods reproduce Java built-in enum functionality:

    public static DayTime[] values()
    {
        return valueList.ToArray();
    }

    public int ordinal()
    {
        return ordinalValue;
    }

    public override string ToString()
    {
        return nameValue;
    }

    public static DayTime valueOf(string name)
    {
        foreach (DayTime enumInstance in DayTime.valueList)
        {
            if (enumInstance.nameValue == name)
            {
                return enumInstance;
            }
        }
        throw new System.ArgumentException(name);
    }
}

考虑到这种复杂性,最好以一种对C#更自然的方式重写逻辑,而不使用枚举。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章