Pregunta

Hay buenas soluciones para representar parámetros enum en C# 3.0?Estoy buscando algo como OCaml o Haxe ha.Sólo puedo pensar en la jerarquía de clases con una simple enumeración de campo para cambiar fácilmente por ahora, tal vez hay mejores ideas?

Ver Ocaml ejemplo a continuación en una de las respuestas, Haxe código de la siguiente manera:

enum Tree {
   Node(left: Tree, right: Tree);
   Leaf(val: Int);
}
¿Fue útil?

Solución

No estar familiarizado con la OCaml o Haxe, y no es lo bastante inteligente como para entender a las otras explicaciones, fui hasta la Haxe enumeración de la documentación - el 'Enum Parámetros de Tipo" bit en la parte inferior parece ser la parte pertinente.

Mi entendimiento basado en que es la siguiente:

Un 'normal' enum es, básicamente, un valor que se limita a las cosas que usted ha definido en su definición enum.Ejemplo En C#:

enum Color{ Red, Green, Yellow, Blue };
Color c = Color.Red;

c puede ser Red, Green, Yellow, o Blue, pero nada más.

En Haxe, usted puede agregar tipos complejos para las enumeraciones, Artificioso ejemplo de su página:

enum Cell<T>{ 
  empty; 
  cons( item : T, next : Cell<T> )
}

Cell<int> c = <I don't know>;

Lo que esta aparece a decir es que c se restringe a ser el valor literal empty (como nuestra vieja usanza C# enumeraciones), o también puede ser un tipo complejo cons(item, next), donde item es un T y next es un Cell<T>.

No haber utilizado alguna vez este parece que es, probablemente, la generación de algunos tipos anónimos (por ejemplo, cómo el compilador de C# ¿cuando ¿ new { Name='Joe'}.
Cada vez que el 'acceso' el valor de enumeración, usted tiene que declarar item y next cuando usted lo hace, y parece que te obligado a temporales de las variables locales.

Haxe ejemplo - Se puede ver en 'siguiente' se usa como una variable local temporal para extraer datos de la anónima contras estructura:

switch( c ) {
  case empty : 0;
  case cons(item,next): 1 + cell_length(next);
}

Para ser honesto, esto me dejó alucinando 'clic' en lo que parecía estar haciendo.Parece increíblemente poderoso, y puedo ver por qué te gustaría estar en busca de una característica similar en C#.

C# las enumeraciones son bastante más parecida a la de C/++ enumeraciones de las que originalmente fueron copiados.Es, básicamente, una linda manera de decir #define Red 1 por lo que el compilador puede hacer comparaciones y almacenamiento con enteros en lugar de cadenas de caracteres cuando se pasa Color los objetos de alrededor.

Mi intento de hacer esto en C# sería el uso de los medicamentos genéricos y de interfaces.Algo como esto:

public interface ICell<T> {
   T Item{ get; set; }
   ICell<T>{ get; set; }
}

class Cons<T> : ICell<T> {
  public T Item{ get; set; } /* C#3 auto-backed property */
  public Cell<T> Next{ get; set; }
}

class EmptyCell<T> : ICell<T>{
  public T Item{ get{ return default(T); set{ /* do nothing */ }; }
  public ICell<T> Next{ get{ return null }; set{ /* do nothing */; }
}

Entonces usted podría tener una List<ICell<T>> que contendría los elementos y la siguiente celda, y usted puede insertar EmptyCell al final (o sólo tiene el Next referencia explícitamente a null).Las ventajas serían que porque EmptyCell no contiene variables miembro, que no requiere ningún espacio de almacenamiento (como el empty en Haxe), mientras que un Cons celda lo harían.
El compilador también puede inline / optimizar los métodos en EmptyCell como ellos no hacen nada, por lo que hay un aumento de velocidad en tan solo tener una Cons con los datos de los miembros se establece en null.

Realmente no lo sé.Yo daría la bienvenida a cualquier otra de las posibles soluciones, ya que no estoy particularmente orgulloso de mi :-)

Otros consejos

El uso de un clase que con las propiedades estáticas para representar los valores de enumeración.Usted puede, opcionalmente, utilizar un constructor privado para la fuerza de todas las referencias a la clase para ir a través de una propiedad estática.

Echa un vistazo a la System.Drawing.Color clase.Se utiliza este enfoque.

C# (el .NET framework en general, hasta donde yo sé) no admite la parametrización de las enumeraciones como Java.Dicho esto, es posible que desee buscar en los Atributos.Algunas de las características que Java las enumeraciones son capaces son algo factible a través de Atributos.

Lo que está mal con el solo uso de una clase para esto?Sus feo, pero eso es lo que el Java gente lo hizo hasta que tenían lenguaje integrado Enum apoyo!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top