当前位置:  开发笔记 > 编程语言 > 正文

在C#中表示参数化枚举的最佳方法?

如何解决《在C#中表示参数化枚举的最佳方法?》经验,为你挑选了1个好方法。

是否有任何好的解决方案来表示参数化的枚举C# 3.0?我正在寻找像OCaml或Haxe这样的东西.我只能想到具有简单枚举字段的类层次结构,以便于现在轻松切换,也许有更好的想法?

请参阅下面的其中一个回复中的Ocaml示例,以下是Haxe代码:

enum Tree {
   Node(left: Tree, right: Tree);
   Leaf(val: Int);
}

Orion Edward.. 7

不熟悉OCaml或Haxe,并且不够聪明地理解其他解释,我去查找Haxe枚举文档 - 底部的'枚举类型参数'位似乎是相关部分.

我的理解基于以下内容:

"普通"枚举基本上是一个值,它仅限于您在枚举定义中定义的内容.C#示例:

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

c可以是Red,Green,Yellow,或Blue,但没有别的.

在Haxe中,您可以在枚举中添加复杂类型,从其页面中获取Contrived示例:

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

Cell c = ;

似乎意味着它c被限制为文字值empty(就像我们过时的C#枚举),或者它也可以是一个复杂的类型cons(item, next),其中itema Tnexta是Cell.

从来没有使用它看起来它可能会生成一些匿名类型(比如C#编译器在你做的时候会这样做new { Name='Joe'}.
每当你访问'枚举值时,你必须声明item,next当你这样做时,它看起来像它们绑定到临时局部变量.

Haxe示例 - 您可以看到'next'被用作临时局部变量来从匿名cons结构中提取数据:

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

说实话,当我"点击"它似乎正在做的事情时,这让我大吃一惊.它似乎非常强大,我可以看到你为什么要在C#中寻找类似的功能.

C#枚举与最初复制它们的C/++枚举几乎相同.它基本上是一种很好的说法,#define Red 1因此当您传递Color对象时,编译器可以使用整数而不是字符串进行比较和存储.

我在C#中做这件事就是使用泛型和接口.像这样的东西:

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

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

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

然后你可以有一个List>包含项目和下一个单元格,并且你可以EmptyCell在最后插入(或者只是将Next引用显式设置为null).优点是因为不EmptyCell包含任何成员变量,所以不需要任何存储空间(如emptyHaxe),而Cons单元格则需要.
编译器也可以内联/优化方法,EmptyCell因为它们什么也不做,因此可能会有一个速度增加,而不仅仅是将Cons其成员数据设置为null.

我真的不知道.我欢迎任何其他可能的解决方案,因为我不是特别自豪我的一个:-)



1> Orion Edward..:

不熟悉OCaml或Haxe,并且不够聪明地理解其他解释,我去查找Haxe枚举文档 - 底部的'枚举类型参数'位似乎是相关部分.

我的理解基于以下内容:

"普通"枚举基本上是一个值,它仅限于您在枚举定义中定义的内容.C#示例:

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

c可以是Red,Green,Yellow,或Blue,但没有别的.

在Haxe中,您可以在枚举中添加复杂类型,从其页面中获取Contrived示例:

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

Cell c = ;

似乎意味着它c被限制为文字值empty(就像我们过时的C#枚举),或者它也可以是一个复杂的类型cons(item, next),其中itema Tnexta是Cell.

从来没有使用它看起来它可能会生成一些匿名类型(比如C#编译器在你做的时候会这样做new { Name='Joe'}.
每当你访问'枚举值时,你必须声明item,next当你这样做时,它看起来像它们绑定到临时局部变量.

Haxe示例 - 您可以看到'next'被用作临时局部变量来从匿名cons结构中提取数据:

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

说实话,当我"点击"它似乎正在做的事情时,这让我大吃一惊.它似乎非常强大,我可以看到你为什么要在C#中寻找类似的功能.

C#枚举与最初复制它们的C/++枚举几乎相同.它基本上是一种很好的说法,#define Red 1因此当您传递Color对象时,编译器可以使用整数而不是字符串进行比较和存储.

我在C#中做这件事就是使用泛型和接口.像这样的东西:

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

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

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

然后你可以有一个List>包含项目和下一个单元格,并且你可以EmptyCell在最后插入(或者只是将Next引用显式设置为null).优点是因为不EmptyCell包含任何成员变量,所以不需要任何存储空间(如emptyHaxe),而Cons单元格则需要.
编译器也可以内联/优化方法,EmptyCell因为它们什么也不做,因此可能会有一个速度增加,而不仅仅是将Cons其成员数据设置为null.

我真的不知道.我欢迎任何其他可能的解决方案,因为我不是特别自豪我的一个:-)

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有