Ada*_*vis 5 c# arrays enums new-operator
在处理嵌入式API(主要是通信协议)时,我经常在C中使用的快捷方式允许我编辑枚举数组,并在此之后正确设置其他所有大小:
typedef enum {
errortype1,
errortype2,
...
errortypeN,
ERROR_TYPE_MAX
} ErrorTypeList;
int errorcounts[ERROR_TYPE_MAX]; // Create array to hold a counter for each error type
Run Code Online (Sandbox Code Playgroud)
只要我在ERROR_TYPE_MAX之前添加新的错误类型,那么我可以在其他地方使用该值来为我提供枚举的大小.
但是,在C#中,这不能正常工作:
enum ErrorTypeList {
errortype1,
errortype2,
...
errortypeN,
ERROR_TYPE_MAX
};
int errorcounts[ErrorTypeList.ERROR_TYPE_MAX]; // Create array to hold a counter for each error type
Run Code Online (Sandbox Code Playgroud)
这种用法介绍错误Array size cannot be specified in a variable declaration提示使用new.
是在运行时定义数组(via new)我唯一的选择,还是有一种方法可以在没有新的情况下实现这一点,因为枚举的大小在编译后不会改变?
有没有替代这种类型的枚举大小模式更适合c#?
如果你想要枚举的大小,你可以这样做:
enum Foo { A , B , C , ... , }
...
int[] someArray = new int[ sizeof(Foo) ] ;
Run Code Online (Sandbox Code Playgroud)
但这不会给你你想要的东西,因为sizeof以八位字节返回对象的大小(在这种情况下为4,因为枚举,默认情况下包装一个Int32).
要获取值的数量 在枚举,做这样的事情:
enum Foo { A , B , C , ... , }
...
int[] someArray = new int[ Enum.GetValues(typeof(Foo)).Length ] ;
Run Code Online (Sandbox Code Playgroud)
如果你打算使用枚举的值来索引数组,你应该注意到这使得[无根据]假设枚举的值从0开始并递增1:随后对enum定义的更改违反了这个假设会破坏事物.
此外,如果枚举具有[Flags]应用于它的属性,则枚举的域可能[远]大于定义的离散值的数量.
你最好使用字典,因此:
[Flags]
enum Foo { Unknown = 0 , A = 1 , B = 2 , C = 4 , D = 8 , E = 16 , ... , }
...
Dictionary<Foo,SomeType> myDictionary = new Dictionary<Foo,SomeType>() ;
Run Code Online (Sandbox Code Playgroud)
现在你的代码更加灵活:你不关心如何安排枚举的内部.
您甚至可以使用预期的键集预填充字典(如果传递的值不是预期的值,则抛出异常).
编辑注:
你也可以这样做:
void DoSomething()
{
int[] someArray = CreateArrayBasedOnFoo<int>() ;
...
return ;
}
public T[] CreateArrayBasedOnFoo<T>()
{
Foo[] values = (Foo[]) Enum.GetValues(typeof(Foo)) ;
int lo = (int) values.Min() ;
int hi = (int) values.Max() ;
int domain = ( hi - lo ) + 1 ;
T[] instance = (T[]) Array.CreateInstance( typeof(T), new int[]{domain} , new int[]{lo} ) ;
return instance ;
}
Run Code Online (Sandbox Code Playgroud)
该CreateArrayBasedOnFoo<T>()方法将返回一个大小适合枚举的数组,其下限是枚举的最小值.例如,如果枚举有3个离散值:3,5和7,则返回的数组长度为5个元素,下限为3.