c# - C# 中的 Java 枚举相当于什么?

标签 c# java enums

C# 中 Java 的枚举相当于什么?

最佳答案

完整的 Java 枚举功能在 C# 中不可用。不过,您可以使用嵌套类型和私有(private)构造函数合理地关闭。例如:

using System;
using System.Collections.Generic;
using System.Xml.Linq;

public abstract class Operator
{
    public static readonly Operator Plus = new PlusOperator();
    public static readonly Operator Minus = 
         new GenericOperator((x, y) => x - y);
    public static readonly Operator Times = 
         new GenericOperator((x, y) => x * y);
    public static readonly Operator Divide = 
         new GenericOperator((x, y) => x / y);

    // Prevent other top-level types from instantiating
    private Operator()
    {
    }

    public abstract int Execute(int left, int right);

    private class PlusOperator : Operator
    {
        public override int Execute(int left, int right)
        {
            return left + right;
        }
    }

    private class GenericOperator : Operator
    {
        private readonly Func<int, int, int> op;

        internal GenericOperator(Func<int, int, int> op)
        {
            this.op = op;
        }

        public override int Execute(int left, int right)
        {
            return op(left, right);
        }
    }
}

当然,您必须使用嵌套类型,但它们提供了方便的“自定义行为”部分,Java 枚举非常适合。在其他情况下,您只需将参数传递给私有(private)构造函数即可获取众所周知的受限值集。

这并没有给你一些东西:

  • 顺序支持
  • 开关支持
  • 枚举集
  • 序列化/反序列化(作为单例)

其中一些可能只需付出足够的努力就可以完成,但如果没有黑客技术,切换实际上是不可行的。现在,如果 语言 做了这样的事情,它可以做一些有趣的事情,通过使骇客自动化(例如,自动声明 const 字段的负载,并更改任何将枚举类型切换为整数,仅允许“已知”情况。)

哦,部分类型意味着您不必将所有枚举值放在同一个文件中。如果每个值都参与其中(这绝对是可能的),那么每个值都可以有自己的文件。

关于c# - C# 中的 Java 枚举相当于什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1376312/

相关文章:

java - 很难制作利用非静态方法的静态方法

c# - 按单词列表在 LINQ 中的第一个字母分组

c# - 解析 avcC 盒内 SPS 的计时信息时出现问题

c# - 使用搜索 Microsoft Graph API C#

java - Ruby 中的高级类 Java 枚举

swift - 如何访问枚举之外的属性

java - 将依赖值注入(inject)枚举

c# - 用于过滤的 LinQ 语句

java - 使用 Eclipse 连接数据库 Oracle 11G () 的问题 :

java - 如何将缓存的 json 字符串与 gson 一起使用?