这个问题困恼本人一个多星期了,在此恳请高手指点,万分感谢!
在嵌入式开发中,时常把常量数据块以const数组形式呈现。当打包进嵌入式设备时会自动把这部分常量数据存放到Data Rom中,程序读取时直接映射到这部分空间地址就行了。
例如:
const unsigned long c_DataArray[] = {
0x00646e65,0x00000505,0x00005cc0,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00001dc9, ...};
在大多数嵌入式设备上,在样做既可以节省Ram空间,也可以减少读取IO负担(如果换做都去文件形式),速度也得到了保证。
但是,本人在切换到C#实现时,不知道如何实现能到到C/C++ const 数组一样的效果。
有些网友建议尝试使用readonly,或fixed空间,但是这依然不能达到我的目的。
我的目的是为了实现一个引擎库,考量到将来要移植到Win Phone设备上,但是就目前本人得到的信息,Win Phone第三方应用软件还无法加载非托管Assembly,所以必须要用C#实现。
恳请哪位高人抽空指导一下,谢谢!
由于数组是引用类型,而const要求提供一个编译期常量,引用类型的编译期常量就只有null了。因此这里毫无办法,只能用readonly关键字。你的代码用C#表达是这样的:
readonly ulong[] Data = new[] { 0x00646e65UL,0x00000505UL,0x00005cc0UL,0x00000000UL };
我不知道为何这样“依然不能达到你的目的”,在我看来const需要的它都能做到,而且性能上也没有任何问题。
感谢大家的回复。
readonly ulong[] Data = new[] { 0x00646e65UL,0x00000505UL,0x00005cc0UL,0x00000000UL };
这里数组引用是readonly,但是数组元素仍是引用类型,可以重定向为别的对象。
以以下代码:
ulong temp = 0;
Data[0] = temp;
而且在C/C++中,const 数组是静态编译是就确定了数组的位子,而在C#在CLR环境中会有动态加载的负担(弱弱的,不是很确定)。
总之,“依然不能达到你的目的":(
@hutun: 那你可以使用ReadOnlyCollection<T>
readonly ReadOnlyCollection<ulong> Data = new ReadOnlyCollection<ulong>(new[] { 0x00646e65UL, 0x00000505UL, 0x00005cc0UL, 0x00000000UL });
这样你给Data[0]赋值就会编译报错了。但是确实不能像C++那样做到编译时就确定空间地址。
同楼上一样不明白为何“依然不能达到你的目的”。。。
如果是.net4.0以上版本,可以尝试一下代码契约