23 votos

¿Cuál es el equivalente de Java enum en C#?

¿Cuál es el equivalente de Java enum en C#?

29voto

Jon Skeet Puntos 692016

Java enum funcionalidad no está disponible en C#. Usted puede venir razonablemente cerca el uso de los tipos anidados y un constructor privado, aunque. Por ejemplo:

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

Por supuesto, usted no tiene que utilizar tipos anidados, pero dan la mano "a la medida" comportamiento de la parte de Java que las enumeraciones son agradables. En otros casos sólo se puede pasar argumentos a un constructor privado para obtener un conocido conjunto restringido de valores.

Un par de cosas de esta no te da:

  • Ordinal apoyo
  • Interruptor de apoyo
  • EnumSet
  • La serialización/deserialización (como un singleton)

Algunos de los que probablemente se podría hacer con suficiente esfuerzo, a pesar de que el interruptor no sería factible sin trucos. Ahora bien, si el lenguaje hizo algo como esto, podría hacer cosas muy interesantes para hacer cambiar de trabajo, haciendo los trucos automática (por ejemplo, de la declaración de una carga de const automáticamente los campos, y el cambio de cambiar el tipo enum a un conmutador a través de los números enteros, sólo permitiendo a los "conocidos" de los casos .)

Ah, y tipos parciales significa que usted no tiene que tener todos los valores de enumeración en el mismo archivo. Si cada valor tiene bastante involucrados (que es definitivamente posible), cada una puede tener su propio archivo.

17voto

Chi Puntos 8991

Las enumeraciones son una de las pocas características del lenguaje que es mejor implementado en java que c#. En java, las enumeraciones son de pleno derecho, el nombre de las instancias de un tipo, mientras que c# las enumeraciones son básicamente constantes con nombre.

Dicho esto, para el caso, que será similar. Sin embargo, en java, tiene más poder, en la que se puede añadir comportamiento del individuo enumeraciones, como lo son de pleno derecho las clases.

¿hay alguna característica en particular que usted está buscando?

5voto

Andrew Cooper Puntos 21126

He aquí otra idea interesante. Se me ocurrió la siguiente Enumeration de la clase base:

public abstract class Enumeration<T>
    where T : Enumeration<T>
{   
    protected static int nextOrdinal = 0;

    protected static readonly Dictionary<int, Enumeration<T>> byOrdinal = new Dictionary<int, Enumeration<T>>();
    protected static readonly Dictionary<string, Enumeration<T>> byName = new Dictionary<string, Enumeration<T>>();

    protected readonly string name;
    protected readonly int ordinal;

    protected Enumeration(string name)
        : this (name, nextOrdinal)
    {
    }

    protected Enumeration(string name, int ordinal)
    {
        this.name = name;
        this.ordinal = ordinal;
        nextOrdinal = ordinal + 1;
        byOrdinal.Add(ordinal, this);
        byName.Add(name, this);
    }

    public override string ToString()
    {
        return name;
    }

    public string Name 
    {
        get { return name; }
    }

    public static explicit operator int(Enumeration<T> obj)
    {
        return obj.ordinal;
    }

    public int Ordinal
    {
        get { return ordinal; }
    }
}

Tiene un parámetro de tipo básicamente por lo que el ordinal contar funcionará correctamente a través de los diferentes derivados de las enumeraciones. Jon Operator ejemplo de arriba, a continuación, se convierte en:

public class Operator : Enumeration<Operator>
{
    public static readonly Operator Plus = new Operator("Plus", (x, y) => x + y);
    public static readonly Operator Minus =  new Operator("Minus", (x, y) => x - y);
    public static readonly Operator Times =  new Operator("Times", (x, y) => x * y);
    public static readonly Operator Divide = new Operator("Divide", (x, y) => x / y);

    private readonly Func<int, int, int> op;

    // Prevent other top-level types from instantiating
    private Operator(string name, Func<int, int, int> op)
        :base (name)
    {
        this.op = op;
    }

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

Esto le da un par de ventajas.

  • Ordinal apoyo
  • La conversión a string y int que hace las sentencias switch factible
  • GetType() dará el mismo resultado para cada uno de los valores de un derivado de tipo de Enumeración.
  • Los métodos Estáticos de System.Enum puede ser añadido a la base de la Enumeración de clase para permitir la misma funcionalidad.

4voto

Bill K Puntos 32115

Usted probablemente podría utilizar el viejo typesafe enum patrón que hemos utilizado en Java antes de llegar a los reales (suponiendo que los de C# en realidad no son clases como un comentario de reclamaciones). El patrón se describe justo antes de que el medio de esta página

0voto

leeeroy Puntos 3664

enum , o necesitas algo en particular que Java enumeraciones que tienen, pero c# no ?

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X